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>
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
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. –
merci pour l'explication de suivi! – heidebock