文 / 秦未
眾所周知队寇,F(xiàn)lask是自由的吩屹,它極易擴展啸驯,擁有非常多的第三方擴展包,這些第三方擴展包主要特點就是簡單祟峦,即學即用罚斗,這也是我們學習Flask的主要原因之一。
當我們想要實現(xiàn)某項功能之前宅楞,網(wǎng)上很有可能已經(jīng)有別人寫好的插件了针姿,我們不需要重復造輪子,而更應該將時間花費在我們想要實現(xiàn)的功能上厌衙。
那么這些第三方擴展包我們從哪里獲取呢距淫?
1.官方獲取擴展包
地址:http://flask.pocoo.org/extensions/
在這個網(wǎng)頁我們能獲取官方團隊驗證的第三方擴展包,并且也提供詳細的文檔供我們查詢婶希。
2.Pycharm獲取擴展包
我們也可以通過Pycharm獲取擴展包榕暇,按照下圖所示步驟去做,我們就可以下載安裝擴展包喻杈。
3.備份與恢復環(huán)境
我們?nèi)绻惭b了這些擴展包彤枢,那么我們?nèi)绾卧诓煌到y(tǒng),不同環(huán)境中同樣也擁有相同版本的第三方擴展包(庫)呢筒饰?
這里我們就利用一個pip的命令就可以了:
pip freeze > requirements.txt
恢復:
pip install -r requirements.txt
4.使用類似Django的manage管理工具
好的缴啡,現(xiàn)在我們需要一個管理工具,管理我們的項目:
pip install flask-script
當然在Pycharm中安裝也是很方便的瓷们。
接下來使用它业栅,我們在app.py中導入它:
from flask_script import Manager
# 這里app已經(jīng)實例化了
manager = Manager(app)
然后項目啟動那里改成:
if __name__ == '__main__':
# app.run(debug=True)
manager.run()
為避免不清楚具體情況,我將所有代碼貼出:
# /app/app.py
# -*- coding:utf-8 -*-
import datetime
from flask import Flask, render_template, request, redirect, url_for, make_response
from os import path
from flask_script import Manager
from werkzeug.routing import BaseConverter
from werkzeug.utils import secure_filename
class RegexConverter(BaseConverter):
def __init__(self, url_map, *items):
super(RegexConverter, self).__init__(url_map)
self.regex = items[0]
app = Flask(__name__)
app.url_map.converters['regex'] = RegexConverter
manager = Manager(app)
@app.route('/')
def index():
# 獲取cookies
# username = request.cookies.get('username')
# 封裝render_template
response = make_response(render_template('blog/index.html', **{
'text': 'Hello, World',
}))
# 設置cookies--參數(shù)1:名稱谬晕,參數(shù)2:值碘裕,expires指定過期時間;(記得導入datetime模塊攒钳!)
outdate = datetime.datetime.today() + datetime.timedelta(days=30)
response.set_cookie('username', 'admin', expires=outdate)
return response
@app.route('/about')
def about():
return '<h1>about</h1>'
@app.route('/user/<username>')
def user(username):
return F'<h1>{username}</h1>'
@app.route('/login/', methods=['GET', 'POST'])
def login():
# 判斷請求方式
if request.method == 'POST':
# POST方式時數(shù)據(jù)是在form里面
username = request.form.get('username')
password = request.form.get('password')
# 獲取文件
my_file = request.files.get('file')
# 獲取當前路徑
basepath = path.abspath(path.dirname(__file__))
# 將路徑連接
upload_path = path.join(basepath, 'static/uploads/')
# 保存文件并將文件名獲取封裝
my_file.save(upload_path + secure_filename(my_file.filename))
# 跳轉(zhuǎn)upload函數(shù)
return redirect(url_for('upload'))
else:
# GET方式時數(shù)據(jù)是在args里面
username = request.args.get('username')
password = request.args.get('password')
return render_template('blog/login.html', method='GET')
@app.route('/upload')
def upload():
return '<h1>上傳成功帮孔!</h1>'
if __name__ == '__main__':
# app.run(debug=True)
manager.run()
終端中運行:
python app.py runserver
也可以在Pycharm中配置一下啟動命令:
在 run 選項的下拉箭頭,選擇 edit configure 選項夕玩,然后在 script parameters 里添加 runserver 即可你弦。
地址還是一樣的:http://127.0.0.1:5000
有時候我們還會遇到一個問題,就是如果我們修改一下代碼就要手動重啟一次服務燎孟,那簡直太浪費我們的時間了禽作,有這樣一個庫可以解決我們的問題,它叫l(wèi)ivereload(可理解為即時刷新)揩页,還是一樣的先安裝它:
pip install livereload
使用它的方法其實也很簡單旷偿,我們先在app.py中建立一個函數(shù):
@manager.command
def dev():
# 導入包
from livereload import Server
# 封裝
live_server = Server(app.wsgi_app)
# 設置監(jiān)測文件路徑
live_server.watch('**/*.*')
# 同時讓它刷新
live_server.serve(open_url=True)
啟動它,終端輸入:
python app.py dev
這樣它就會默認監(jiān)測項目文件變動爆侣,并即時刷新萍程。
---end---