Python+Flask框架項目Demo入門
本例子用到了 Flask+藍圖+Flask-Login+SQLAlchemy+WTForms+PyMySQL相關架構
Flask Web框架介紹
Flask是微型web框架,框架本身十分精簡,微型並不代表其功能弱,核心代碼基於Werkzeug, Jinja 2 這兩個庫,它以插件形式的進行功能擴展,且插件易於安裝與使用,並且可以自行開發擴展插件
與其他web框架類似,flask中請求(request),路由(route),響應(response)構成其完整的一個基本http流程。
flask流行的主要原因:
- 有非常齊全的官方文檔,上手非常方便
- 有非常好的拓展機制和第三方的拓展環境,工作中常見的軟件都有對應的拓展,自己動手實現拓展也很容易
- 微型框架的形式給了開發者更大的選擇空間
藍圖介紹
在Flask項目中可以用Blueprint(藍圖)實現模塊化的應用,使用藍圖可以讓應用層次更清晰,開發者更容易去維護和開發項目。藍圖將作用於相同的URL前綴的請求地址,將具有相同前綴的請求都放在一個模塊中,這樣查找問題,一看路由就很快的可以找到對應的視圖,並解決問題了。
藍圖提供模板過濾器、靜態文件、模板和其它功能
Flask擴展庫
Flask-Login庫
Flask-Login 通過 user session,提供登錄的常見任務,比如登入 (logging in)、登出 (logging out) 和當前用戶 (current user)
login_user() 函數:實現用戶的登入,一般在登入的視圖函數中調用
logout_user() 函數:實現登出功能
current_user 屬性:獲取當前用戶
對於使用者來說,如果需要頁面是授權用戶才可見,在相應視圖函數前加上 @login_required 裝飾器進行聲明即可,@login_required 裝飾器對於未登錄用戶訪問,默認處理是重定向到 LoginManager.login_view 所指定的視圖
Flask-Script庫
提供向Flask插入外部腳本的功能,包括運行一個開發用的服務器,一個定制的Python shell,設置數據庫的腳本,cronjobs,及其他運行在web應用之外的命令行任務;使得腳本和系統分開;
Flask Script和Flask本身的工作方式類似,只需定義和添加從命令行中被Manager實例調用的命令;
WTForms表單
WTForms是一個支持多個web框架的form組件,主要用於對用戶請求數據進行驗證。
簡單代碼例子:
class Myvalidators(object):
'''自定義驗證規則'''
def __init__(self,message):
self.message = message
def __call__(self, form, field):
print(field.data,"用戶輸入的信息")
if field.data == "haiyan":
return None
raise validators.ValidationError(self.message)
class LoginForm(Form):
'''Form'''
name = simple.StringField(
label="用戶名",
widget=widgets.TextInput(),
validators=[
Myvalidators(message="用戶名必須是haiyan"),#也可以自定義正則
validators.DataRequired(message="用戶名不能為空"),
validators.Length(max=8,min=3,message="用戶名長度必須大於%(max)d且小於%(min)d")
],
render_kw={"class":"form-control"} #設置屬性
)
pwd = simple.PasswordField(
label="密碼",
validators=[
validators.DataRequired(message="密碼不能為空"),
validators.Length(max=8,min=3,message="密碼長度必須大於%(max)d且小於%(min)d"),
validators.Regexp(regex="\d+",message="密碼必須是數字"),
],
widget=widgets.PasswordInput(),
render_kw={"class":"form-control"}
)
@app.route('/login',methods=["GET","POST"])
def login():
if request.method =="GET":
form = LoginForm()
return render_template("login.html",form=form)
else:
form = LoginForm(formdata=request.form)
if form.validate():
print("用戶提交的數據用過格式驗證,值為:%s"%form.data)
return "登錄成功"
else:
print(form.errors,"錯誤信息")
return render_template("login.html",form=form)
login.html
<body>
<form action="" method="post" novalidate>
<p>{{ form.name.label }} {{ form.name }} {{ form.name.errors.0 }}</p>
<p>{{ form.pwd.label }} {{ form.pwd }} {{ form.pwd.errors.0 }}</p>
<input type="submit" value="提交">
<!--用戶名:<input type="text">-->
<!--密碼:<input type="password">-->
<!--<input type="submit" value="提交">-->
</form>
</body>
SQLAlchemy
SQLAlchemy是一個很強大的關系型數據庫框架,支持多種數據庫后台。SQLAlchemy提供了高層ORM,也提供了使用數據庫原生SQL的低層功能。
ORM:將對對象的操作轉換為原生SQL
優點
易用性,可以有效減少重復SQL
性能損耗少
設計靈活,可以輕松實現復雜查詢
移植性好
示例代碼
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Student(db.Model):
s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(16), unique=True)
s_age = db.Column(db.Integer, default=1)
__tablename__ = "student"
其中:
Integer表示創建的s_id字段的類型為整形,
primary_key表示是否為主鍵
String表示該字段為字符串
unique表示該字段唯一
default表示默認值
autoincrement表示是否自增
最后代碼地址
github項目代碼地址: 示例項目地址
項目運行效果截圖

