Flaskアプリケーションを、サブ・ディレクトリで動かす。しかも、Post Methodのルーティング(@aoo.route()) も機能させる。 はまると、はまりますので、機能する設定を、まとめておきます。
(エンベデッド・モードです。)
このエンベデッド・モードの書き方で、別のsub-domain名をつけたURLのサブディレクトリーでも
APPLIを複数、動かすことができます。
1.conf.ファイル
etc/httpd/conf.d に作ったconfファイルの内容。
実際には、httpd.confにも、Virtual Host を使う宣言を1行書く必要があります。
詳細は、こちら。【 これで動く (3) !! WebArena VPS(CentOS7)でFlaskを動かす (routingの確認) 】
Directory: /etc/httpd/conf.d
LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi.so
<VirtualHost *:80>
ServerName mossymob.tk
ServerAlias www.mossymob.tk
WSGIScriptAlias /firstapp /var/www/html/firstapp/myapp.wsgi
<Directory "/var/www/html/firstapp/">
Options Includes ExecCGI FollowSymLinks
Require all granted
</Directory>
CustomLog /var/www/html/access.log common
ErrorLog /var/www/html/error.log
LogLevel info
</VirtualHost>
注意点)
◆モードについて
モードは、エンベデッド・モード(Embeded Mode)です。 mod_wsgiのデフォルトは、エンベデッド・モードです。 エンベデッド・モードは、wsgiファイルが変更になると、自動でリロードするところです。
pyファイルや、confファイルが変更されても、自動ロードされませんので、手動でリロードする必要があります。
◆WSGIScriptAliasについて
WSGIScriptAliasは2つの引数をとります。
最初は、wsgiのMounting Point。 2つ目は、wsgiファイルまでのFull Path.。 第一引数は省略も可能。省略した場合はルートディレクトリになりますので、サブ・ディレクトリでFlask Appを動かしたい場合は、Mouting Pointを明記しないと、上手く機能しません。
2. app.py
Directory: /var/www/html/firstapp/app.py
app.py
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def index():
message="Hi, There!"
return render_template("sample01.html", message=message)
@app.route('/add',methods=['POST'])
def add():
if request.method =='POST':
result = request.form['new_wish']
else:
result = "Function add() is alive, but not a intended way."
return render_template("sample02.html", result=result)
if __name__ == '__main__':
app.run(debug=true)
app = Flask(__name__)
@app.route('/')
def index():
message="Hi, There!"
return render_template("sample01.html", message=message)
@app.route('/add',methods=['POST'])
def add():
if request.method =='POST':
result = request.form['new_wish']
else:
result = "Function add() is alive, but not a intended way."
return render_template("sample02.html", result=result)
if __name__ == '__main__':
app.run(debug=true)
注意点)
@app.route() は、ブラウザとアクセスするurlと、動かすfunctionを紐づける(Mapping)する機能です。 urlにアクセスされることをtriggerにして、functionが動きます。
3. wsgiファイル
Directory: /var/www/html/firstapp/myapp.wsgi
# coding: utf-8
import sys
sys.path.insert(0, '/var/www/html/firstapp')
from app import app as application
注意点)import sys
sys.path.insert(0, '/var/www/html/firstapp')
from app import app as application
特にありません。よくTutorialにあるそのままです。
4.sample01.html
Directory : /var/www/html/firstapp/templates/sample01.html
<html>
<head>
<meta charset="utf-8">
</head>
<body>
{{message}}
<form action="/firstapp/add" method="post">
<p>Input the num you like:</p>
<input type="text" name="new_wish" >
<input type="submit" value="Do">
</form>
</body>
</html>
注意点)<head>
<meta charset="utf-8">
</head>
<body>
{{message}}
<form action="/firstapp/add" method="post">
<p>Input the num you like:</p>
<input type="text" name="new_wish" >
<input type="submit" value="Do">
</form>
</body>
</html>
form action のパスを、flask appのマウンティング・ポイント(endpoint)からの相対パスで記述します。 これに気づかずに、はまりました。
WSGIScript Aliasとこの<form action>のパスの記述方法が、気を付けるべき点でした。
2つのアプリをサブ・ディレクトリーで動かす場合は、シンプルに以下のVirtual Hostの設定でOK.
LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi.so
<VirtualHost *:80>
ServerName mossymob.tk
ServerAlias www.mossymob.tk
#Description for 'First APP'
WSGIScriptAlias /firstapp /var/www/html/firstapp/myapp.wsgi
Alias posts var/www/html/firstapp/posts
<Directory "/var/www/html/firstapp/">
Options Includes ExecCGI FollowSymLinks
Require all granted
</Directory>
#Description for 'Second APP'
WSGIScriptAlias /secondapp /var/www/html/secondapp/myapp.wsgi
<Directory "/var/www/html/secondapp/">
Options Includes ExecCGI FollowSymLinks
Require all granted
</Directory>
CustomLog /var/www/html/access.log common
ErrorLog /var/www/html/error.log
LogLevel info
</VirtualHost>
以上
0 件のコメント:
コメントを投稿