2015-12-15 1 views
0

J'ai donc travaillé avec Flask & Bootstrap sur un serveur Apache. Je l'ai obtenu au point où je peux accéder à l'application & rendre le « premier » ou modèle « principal » w/l'itinéraire suivant:Flask avec problèmes de routage Apache et FCGI

de view.py:

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

Malheureusement, tous les tentative d'acheminement vers une autre page Web/fonction de main.html échoue. J'utilise la fonction "url_for" dans la liste de navigation nav href, en essayant d'obtenir flask pour fournir la page web xls-upload.html à Apache.

de 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> 

de view.py:

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

On dirait que la fonction est engagée, car l'URL change à http://myapp/upload, mais la page html est pas rendu/retourné par la fonction - à la place je reçois un 404 "Not Found". Je ne peux pas sembler retourner quelque chose de la fonction, même return "Hello World". Il semblerait qu'Apache tente vraiment de résoudre le chemin http://myapp/upload, plutôt que d'avoir un socket ouvert à l'application Flask à travers laquelle le code HTML est ensuite envoyé. Je ne suis pas sûr si c'est un problème de FCGI, s'il me manque un problème de chemin relatif/absolu, mal compris comment Flask fonctionne en général, ou une combinaison de tous, etc.

Je suis nouveau à Flask J'espère que quelqu'un pourra m'aider en cours de route car j'ai vraiment l'impression d'être dans une impasse.

Merci d'avance!

Mon application flacon est structuré comme suit:

  • var/www/cgi-bin/myapp/(dir racine)
    • start.fcgi
    • de view.py (le routage de flacon/fichier app)
    • statique (dir)
      • fichiers bootstrap
    • modèles (dir)
      • main.html
      • xls-Upload.html

Voici mes fichiers applicables:

1)/etc /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/templates/main. 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> 

Répondre

0

FCGI ne re allier un moyen recommandé de servir une application web Python. Vous devriez regarder dans l'une des nombreuses façons de lancer WSGI. Cependant, en supposant que vous ayez besoin de le faire pour une raison quelconque, vous avez un problème de configuration mineur qui est la cause de votre problème; vous avez besoin d'une barre oblique finale sur le chemin ScriptAlias. Avec ceci, Apache transmettra le chemin complet au script start.fcgi, au lieu de le remplacer.

Notez que même avec FCGI, vous ne devriez pas mettre le code de votre application dans cgi-bin. Il n'a pas besoin d'être là, car il n'est pas exécuté par le serveur Web comme une application CGI. En fait, votre code ne devrait même pas être dans/var/www.

+0

HI Daniel, merci beaucoup pour votre réponse qui a immédiatement permis au routage de fonctionner! Evan si cela fonctionne, je ne comprends toujours pas exactement pourquoi ... J'espérais que vous pourriez peut-être développer l'interaction slash, apache, flask. Lorsque vous cliquez sur le lien url_for, que se passe-t-il exactement entre main.html, flask et apache? – heidebock

+0

Le fichier main.html n'a rien à voir avec quoi que ce soit. La différence est juste dans la façon dont le chemin est traité; avec le slash final, tout chemin suivant sera ajouté au chemin scriptalias, donc il passe par le fichier start.fcgi et est passé à flup. Sans cela, le chemin * remplace * start.fcgi; c'est exactement la même chose que si vous étiez sur le chemin /foo/bar.html dans votre navigateur et navigué vers baz.html, vous finiriez par /foo/baz.html au lieu de /foo/bar.html/baz.html. –

+0

merci pour l'explication de suivi! – heidebock