flask
一、虛擬環境安裝
安裝 pipenv 管理 python 開發環境
pip install pipenv
pipenv install --dev six # 只將模塊安裝到開發環境中
pipenv shell # 進入虛擬環境
exit # 退出虛擬環境
pipenv --rm # 刪除整個環境 不會刪除pipfile 退出環境再進行刪除
pipenv # 查看更多命令幫助
pipenv --venv # 查看虛擬環境位置
在使用 pycharm 開發時,需要找到對應的 python.exe (也就是設置對應的環境),爲了方便管理環境,可以進行自定義設置
二、項目創建
利用 pycharm 創建項目(專業版)
app.run這種方式只適合於開發,如果在生產環境中,應該使用Gunicorn或者uWSGI來啓動。如果是在終端運行的,可以按ctrl+c來讓服務停止。
直接創建
@app.route("/") 代表訪問的是 / 也就是根目錄
hello_world 函數就是首頁實現的效果
雖然訪問 http://127.0.0.1:5000/ 的時候不寫/ 也可以訪問到首頁,但是這樣寫讓代碼一目瞭然
app.run() 讓項目跑起來
跑項目的時候需要注意項目的環境的正確配置,避免項目啓動失敗哦。
三、啓動項目和開啓 Debug 模式
、
上面非 Debug 模式進行調試項目需要每次重啓項目,所以更改代碼,開啓 Debug 模式
# 方法一
app.run(debug=True)
# 這個方法有一個 port 參數來改變端口值
# 方法二
# app.debug = True
# app.run()
# 方法三
# app.config 是個繼承字典的類 使用update方法
# app.config.update(DEBUG=True)
# app.run()
# 使用配置文件幫助代碼管理
# app.config.from_object(config)
# app.run()
Debugger PIN: 758-272-092 在報錯的情況下,可直接提供在顯示頁面進行調試的通信證
四、項目配置
Flask項目的配置,都是通過app.config對象來進行配置的。比如要配置一個項目處於DEBUG模式下,那麼可以使用app.config['DEBUG] = True來進行設置,那麼Flask項目將以DEBUG模式運行。在Flask項目中,有四種方式進行項目的配置
- 直接硬編碼
app = Flask(__name__)
app.config['DEBUG'] = True
- 因爲app.config是flask.config.Config的實例,而Config類是繼承自dict,因此可以通過update方法
app.config.update(
DEBUG=True,
SECRET_KEY='...'
)
- 如果你的配置項特別多,你可以把所有的配置項都放在一個模塊中,然後通過加載模塊的方式進行配置,假設有一個settings.py模塊,專門用來存儲配置項的,此時你可以通過app.config.from_object()方法進行加載,並且該方法既可以接收模塊的的字符串名稱,也可以模塊對象
# 1. 通過模塊字符串
app.config.from_object('settings')
# 2. 通過模塊對象
import settings
app.config.from_object(settings)
4.也可以通過另外一個方法加載,該方法就是app.config.from_pyfile(),該方法傳入一個文件名,通常是以.py結尾的文件,但也不限於只使用.py後綴的文件
app.config.from_pyfile('settings.py',silent=True)
from juran
五、URL 與函數映射
一個URL要與執行函數進行映射,使用的是@app.route裝飾器。@app.route裝飾器中,可以指定URL的規則來進行更加詳細的映射。
案例:映射一個文章詳情的URL
語法提示:尖括號是固定寫法< variable >,指定類型則要寫成 < converter:variable >
string: 默認的數據類型,接受沒有任何斜槓/的字符串
# 設置一個列表頁面
# http://127.0.0.1:5000/list/12
@app.route("/list/<aid>")
def article_list(aid):
return "這是第{}篇文章".format(aid)
# 不接受除了數字之外的
@app.route("/list/<int:aid>")
def article_list(aid):
return "這是第{}篇文章".format(aid)
# detial 頁面
# 接受參數爲 / 和字母 純數字則調用回 article_list
@app.route("/list/<path:aid>")
def article_detail(aid):
return "detial-這是第{}篇文章".format(aid)
url 地址 匹配對比:
同時兼具 int 和 path
# /<any(article, blog):url_path>/ 冒號後面不可以加空格
@app.route("/<any(article, blog):url_path>/")
def item(url_path):
return url_path
通過傳統的?=的形式來傳遞參數,可以通過request.args.get(‘id’)來獲取id的值。
如果是post方法,則可以通過request.form.get(‘id’)來進行獲取。
# http://127.0.0.1:5000/wd?name=aa
@app.route("/wd")
def baidu():
return request.args.get("name")
url_for函數可以幫我們實現通過一個函數去獲得這個URL。
url_for()函數接收兩個及以上的參數,他接收函數名作爲第一個參數,接收對應URL規則的命名參數,如果還出現其他的參數,則會添加到URL的後面作爲查詢參數。
# return 是頁面信息
# 打印是在編譯器控制檯內進行打印
@app.route("/")
def index():
print(url_for("article_list", aid=2)) # article_list 有一個 aid 參數,在 url_for 的時候要帶上
return "hello world"
@app.route("/article/<aid>/")
def article_list(aid):
return "article list {}".format(aid)
@app.route("/detail/<did>/")
def article_detail(did):
# print(url_for("index")) # index 沒有參數傳入 url
print(url_for("index", next="/")) # 傳入不存在的參數 打印信息爲/?next=%2F 這是對特殊字符/進行了轉義
return "article detail {}".format(did)
在@app.route()中可以傳入一個關鍵字參數methods來指定本方法支持的HTTP方法,默認情況下,只能使用GET請求
# methods 讓其可以接收 GET','POST 兩種請求
@app.route("/signup/", methods=['GET','POST'])
def login():
# print(type(request.args))
# get 請求
# http://127.0.0.1:5000/signup/?username=juju
print(request.args.get('username'))
# post 請求
# print(request.form.get("name"))
return "login"
在flask中,重定向是通過flask.redirect(location,code=302)這個函數來實現的,location表示需要重定向到的URL,配合url_for()函數來使用,code表示採用哪個重定向,默認是302也即暫時性重定向,可以修改成301來實現永久性重定向
# 訪問 http://127.0.0.1:5000/profile/ 會被重定向 狀態碼302
@app.route("/profile/")
def profile():
name = request.args.get("name")
if name:
return name
else:
# 重定向
return redirect(url_for("login")) # code=301
return "nnn"
- Response對象,Response將該字符串作爲主體,狀態碼爲200,MIME類型爲text/html,然後返回該Response對象。
from werkzeug.wrappers import Response
@app.route('/about/')
def about():
resp = Response(response='about page',status=200,content_type='text/html;charset=utf-8')
return resp
- 元組。元組中格式是(response,status,headers)。response爲一個字符串,status值是狀態碼,headers是一些響應頭。
return ('關於我們',200) # 只返回 關於我們
- dict
略
- 可以使用make_response函數來創建Response對象,這個方法可以設置額外的數據,比如設置cookie,header信息
rom flask import make_response
@app.route('/about/')
def about():
return make_response('about page') # 這個必須要有返回值
如果不是以上三種類型。那麼Flask會通過Response.force_type(rv,request.environ)轉換爲一個請求對象