Flask 是一套支援 Python3 的全球資訊網程式框架, 這裡希望用它來開發網際輔助機械設計程式.
http://flask.pocoo.org/ 是一套簡潔的 Python3 網際程式框架, 在這一系列的導引資料中, 將利用 https://github.com/2015fallhw/simpleflask 倉儲來存放資料, 並將資料同步推送到 http://simpleflask-2014openshift.rhcloud.com/ 執行.
程式環境
假如在 Windows 環境中, 使用可攜套件: https://github.com/chiamingyen/kmol2016, 則已經內建 Flask 模組, 假如沒有, 可以利用
pip install Flask 安裝.
假如是在 Ubuntu, 可以要用 pip3 install Flask 安裝, 至於在 OpenShift 的 Python3 應用程式, 則是透過 setup.py 安裝.
#setup.py 檔案 from setuptools import setup setup(name='KMOL 2016 project', version='1.0', description='OpenShift App', author='KMOL', author_email='course@mde.tw', url='https://www.python.org/community/sigs/current/distutils-sig', install_requires=['Flask>=0.10.1'], )
由於這裡所開發的 Flask 程式, 需要在近端與 OpenShift 都能運作, 因此 wsgi.py 的內容設計為:
#!/usr/bin/python # 導入 os 模組, 主要用來判斷是否在 OpenShift 上執行 import os # 導入同目錄下的 myflaskapp.py import myflaskapp # 以下開始判斷在 OpenShift 或近端執行 if 'OPENSHIFT_REPO_DIR' in os.environ.keys(): # 表示程式在雲端執行 application = myflaskapp.app else: # 表示在近端執行, 以 python3 wsgi.py 執行, 若採 uwsgi 則與 Openshift 運作模式相同 myflaskapp.app.run(debug=True)
也就是說, wsgi.py 會透過os.environ.keys() 的值來判定執行的環境, 若是在 uwsgi 的環境執行時, 則必須使用與 OpenShift 環境相同的啟動模式.
而 wsgi.py 中所導入的 myflaskapp.py 內容則為:
# coding: utf-8 from flask import Flask, send_from_directory, request, redirect, render_template, session, make_response import random app = Flask(__name__) # 使用 session 必須要設定 secret_key # In order to use sessions you have to set a secret key # set the secret key. keep this really secret: app.secret_key = 'A0Zr9@8j/3yX R~XHH!jmN]LWX/,?R@T' @app.route("/") def index(): #這是猜數字遊戲的起始表單, 主要在產生答案, 並且將 count 歸零 # 將標準答案存入 answer session 對應區 theanswer = random.randint(1, 100) thecount = 0 # 將答案與計算次數變數存進 session 對應變數 session['answer'] = theanswer session['count'] = thecount return render_template("index.html", answer=theanswer, count=thecount) @app.route('/user/') # 為了避免 syntaxhighlighter 自動加上 , 在這裡先行用註解補上, 之後再找解決方案 def user(name): return render_template("user.html", name=name) @app.route('/red') def red(): # 重新導向 google return redirect("http://www.google.com") @app.route('/guessform') def guessform(): session["count"] += 1 guess = session.get("guess") theanswer = session.get("answer") count = session.get("count") return render_template("guessform.html", guess=guess, answer=theanswer, count=count) @app.route('/docheck', methods=['POST']) def docheck(): # session[] 存資料 # session.get() 取 session 資料 # 利用 request.form[] 取得表單欄位資料, 然後送到 template guess = request.form["guess"] session["guess"] = guess # 假如使用者直接執行 doCheck, 則設法轉回根方法 if guess is None: redirect("/") # 從 session 取出 answer 對應資料, 且處理直接執行 docheck 時無法取 session 值情況 try: theanswer = int(session.get('answer')) except: redirect("/") # 經由表單所取得的 guess 資料型別為 string try: theguess = int(guess) except: return redirect("/guessform") # 每執行 doCheck 一次,次數增量一次 session["count"] += 1 count = session.get("count") # 答案與所猜數字進行比對 if theanswer < theguess: return render_template("toobig.html", guess=guess, answer=theanswer, count=count) elif theanswer > theguess: return render_template("toosmall.html", guess=guess, answer=theanswer, count=count) else: # 已經猜對, 從 session 取出累計猜測次數 thecount = session.get('count') return "猜了 "+str(thecount)+" 次, 終於猜對了, 正確答案為 "+str(theanswer)+": 再猜" return render_template("docheck.html", guess=guess) @app.route('/option', methods=["GET", "POST"]) def option(): option_list1 = ["1", "2", "3", "4"] option_list2 = ["a", "b"] return render_template('option.html', option_list1=option_list1, option_list2=option_list2) @app.route('/optionaction', methods=['POST']) def optionaction(): # 這裡將根據使用者所選擇的選項值, 來進行後續的設計運算 return request.form["option1"] + ":" + request.form["option2"] # 等運算或資料處理結束後, 再將相關值送到對應的 template 進行資料的展示 #return render_template('optionaction.html', option_list1=option_list1, option_list2=option_list2) if __name__ == "__main__": app.run()
此外, 因為 Flask 內定靜態目錄名稱為 static, 且 template 名稱為 templates, 因此在最基本的 Flask 程式架構中, 也需要自行建立這兩個目錄, 然後將靜態文件放入 static 目錄中, 而對應的 template 文件檔案, 則放入 templates 目錄中.
Comments
comments powered by Disqus