☆☆ 新着記事 ☆☆

2019年1月6日日曜日

(まとめ) Post Method対応のFlask Appをサブディレクトリーで動かす


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.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
注意点)
特にありません。よく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>
注意点)
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 件のコメント:

コメントを投稿