2015-12-15 3 views
0

Итак, я работал с флягой & Bootstrap на сервере Apache. Я получил его до точки, где я могу получить доступ к приложению & визуализации «первый» или «основной» шаблон ж/следующему маршруту:Флакон с проблемами маршрутизации Apache и FCGI

из view.py:

@app.route('/') 
def fn_home(): 
    return render_template("main.html") 

К сожалению, каждый попытка выполнить переход на другую веб-страницу/функцию из main.html не удалась. Я использую функцию url_for в списке навигационных панелей href, пытаясь получить флэшку для доставки веб-страницы xls-upload.html в Apache.

из main.html:

<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
    <ul class="nav navbar-nav"> 
    <li><a href="{{ url_for('upload') }}">Upload Spreadsheets </a></li> 

из view.py:

@app.route('/upload') 
def upload(): 
    return render_template("xls-upload.html") 

Похоже, что функция в настоящее время занимается, так как изменения URL в http://myapp/upload, но страница HTML НЕ rendered/возвращается функцией - вместо этого я получаю 404 "Not Found". Кажется, я ничего не могу вернуть от функции, даже return "Hello World".

Это похоже на то, что Apache действительно пытается разрешить путь http://myapp/upload, вместо того, чтобы иметь сокет, открытый до приложения Flask, через который затем отправляется html. Я не уверен, что это проблема FCGI, если мне не хватает относительного/абсолютного пути, непонимание того, как Flask работает вообще или какая-то комбинация из всех и т. Д.

Я новичок в Flask, так что Я надеюсь, что кто-то может помочь мне на этом пути, так как я действительно чувствую, что я зашел в тупик.

Заранее благодарен!

Моя колбу приложение имеет следующую структуру:

  • вар/WWW/CGI-BIN/MyApp/(корень реж)
    • start.fcgi
    • view.py (маршрутизация Колбу/файл приложение)
    • статических (реж)
      • бутстраповских файлов
    • шаблоны (реж)
      • main.html
      • XLS-upload.html

Вот мои применимые файлы:

1)/и т.д. /httpd/conf.d/myapp:

<VirtualHost *:80> 
    ServerAdmin [email protected] 

    DocumentRoot /var/www/cgi-bin/myapp/static/ 
    ServerName myapp 

    Alias /static/ /var/www/cgi-bin/myapp/static/ 
    ScriptAlias//var/www/cgi-bin/myapp/start.fcgi 

    <Directory "var/www/cgi-bin/myapp"> 
     AllowOverride None 
     Order allow,deny 
     Allow from all 
     AuthType Basic 
     AuthUserFile /etc/httpd/.htpasswd 
     AuthName 'Enter Password' 
     Require valid-user 
    </Directory> 

</VirtualHost> 

2)/var/www/cgi-bin/myapp/start.FCGI:

#!/usr/bin/python 

# IMPORTS: 

from flup.server.fcgi import WSGIServer 
from view import app 

if __name__ == '__main__': 
    WSGIServer(app).run() 

3) /var/www/cgi-bin/myapp/view.py:

#!/usr/bin/python 

# IMPORTS: 
import os 
from flask import Flask, render_template, url_for, request, session, redirect 
from werkzeug import secure_filename 

# STATIC VARIABLES 
UPLOAD_FOLDER = 'var/www/cgi-bin/myapp/xls-dir' 
ALLOWED_EXTENSIONS = set(['xls']) 

## flask: 
app = Flask(__name__) 
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 

# FUNCTIONS 
def fn_allowed_file(filename): 
    return '.' in filename and \ 
      filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS 

@app.route('/') 
def fn_home(): 
    return render_template("main.html") 

@app.route('/upload') 
def upload(): 
    return render_template("xls-upload.html") 
    #return "HI there" 

if __name__ == '__main__': 
    app.run(debug=True, host='0.0.0.0') 

4)/Var/WWW/CGI-BIN/MyApp/шаблоны/главное. HTML:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> 
    <title>ALG Tools HOME</title> 

    <!-- Bootstrap --> 
    <link href="{{ url_for('static', filename = 'css/bootstrap.min.css') }}" rel="stylesheet"> 
    </head> 
<nav class="navbar navbar-default"> 
    <div class="container-fluid"> 
    <!-- Brand and toggle get grouped for better mobile display --> 
    <div class="navbar-header"> 
     <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> 
     <span class="sr-only">Toggle navigation</span> 
     <span class="icon-bar"></span> 
     <span class="icon-bar"></span> 
     <span class="icon-bar"></span> 
     </button> 
     <a class="navbar-brand" href="/">ALG Tool - HOME</a> 
    </div> 

    <!-- Collect the nav links, forms, and other content for toggling --> 
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
     <ul class="nav navbar-nav"> 
     <li><a href="{{ url_for('upload') }}">Upload Spreadsheets </a></li> 
     <li><a href="/xls-download.html">Download Spreadsheets</a></li> 
     <li><a href="/cfg-generate.html">Generate Configs</a></li> 
     </ul> 
    </div> 
    </div> 
</nav> 

    <body> 
    <h2>ALG stuff</h2> 

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
    <!-- Include all compiled plugins (below), or include individual files as needed --> 
    <script src="{{ url_for('static', filename = 'js/bootstrap.min.js') }}"></script> 
    </body> 

</html> 

5) /var/www/cgi-bin/myapp/templates/xls-upload.html:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> 
    <title>ALG XLS Upload</title> 

    <!-- Bootstrap --> 
    <link href="{{ url_for('static', filename = 'css/bootstrap.min.css') }}" rel="stylesheet"> 
    </head> 
<nav class="navbar navbar-default"> 
    <div class="container-fluid"> 
    <!-- Brand and toggle get grouped for better mobile display --> 
    <div class="navbar-header"> 
     <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> 
     <span class="sr-only">Toggle navigation</span> 
     <span class="icon-bar"></span> 
     <span class="icon-bar"></span> 
     <span class="icon-bar"></span> 
     </button> 
     <a class="navbar-brand" href="/">ALG Tool - HOME</a> 
    </div> 

    <!-- Collect the nav links, forms, and other content for toggling --> 
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
     <ul class="nav navbar-nav"> 
     <li><a href="/xls-upload.html">Upload Spreadsheets </a></li> 
     <li><a href="/xls-download.html">Download Spreadsheets</a></li> 
     <li><a href="/cfg-generate.html">Generate Configs</a></li> 
     </ul> 
    </div> 
    </div> 
</nav> 

    <body> 
    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
    <!-- Include all compiled plugins (below), or include individual files as needed --> 
    <script src="{{ url_for('static', filename = 'js/bootstrap.min.js') }}"></script> 

    </body> 

</html> 

ответ

0

FCGI не повторно как рекомендуемый способ обслуживания веб-приложения Python. Вы должны изучить один из многих способов запуска WSGI.

Однако, предполагая, что вам необходимо это сделать по какой-либо причине, у вас возникла небольшая проблема с конфигурацией, которая является причиной вашей проблемы; вам понадобится конечная косая черта в пути ScriptAlias.

ScriptAlias//var/www/cgi-bin/myapp/start.fcgi/ 

При этом, Apache будет проходить полный путь к сценарию start.fcgi, вместо того, чтобы заменить его.

Обратите внимание, что даже с FCGI вы не должны помещать код приложения в cgi-bin. Он не должен быть там, поскольку он не управляется веб-сервером, как приложение CGI. Фактически, ваш код вообще не должен находиться под/var/www.

+0

HI Daniel, большое спасибо за ваш ответ, который сразу позволил маршрутизатору работать! Эван, хотя это работает, я до сих пор не понимаю, почему ... Я надеялся, что вы, возможно, сможете расширить сцепление с косой чертой, apache, флягой? Когда вы нажимаете ссылку url_for, что именно происходит между main.html, flask и apache? – heidebock

+0

Главное.html ничего не имеет к делу. Разница заключается только в том, как обрабатывается путь; с завершающим косой чертой, любой последующий путь будет добавлен в путь к скриптали, поэтому он проходит через файл start.fcgi и передается в flup. Без этого путь * заменяет * start.fcgi; это точно так же, как если бы вы были на пути /foo/bar.html в своем браузере и перешли на baz.html, вы попали бы в /foo/baz.html вместо /foo/bar.html/baz.html. –

+0

спасибо за последующее объяснение! – heidebock

Смежные вопросы