最近在學(xué)習(xí)python的flask框架,在表單驗(yàn)證的時(shí)候遇到了一些困惑,現(xiàn)提出來,然望大家可以給我解答下。
1.wtforms的表單生成和表單驗(yàn)證一般都是一起用的,但是現(xiàn)在我己經(jīng)有了前端模板,頁面己經(jīng)寫好,我只需要使用表單驗(yàn)證功能,這樣的話該如何使用呢?
2.如果要做成前后端分離的狀態(tài),前端用ajax提交,后端需要對所提交的數(shù)據(jù)做驗(yàn)證后返回結(jié)果,這樣的話該如何處理?是可以直接使用wtforms還是有相應(yīng)的別的庫可以使用, 還是必須要自己寫呢?
3.看了wtforms的使用方法,貌似驗(yàn)證都是基于表單驗(yàn)證的,這樣的話我如果在api中又如何使用呢?
WTForms本身既可以用來渲染html控件,可以單獨(dú)用來驗(yàn)證表單,如果要支持JSON,可以用1樓的hack。
我推薦你用flask_wtf,這個(gè)插件,這個(gè)插件是對wtfoms的進(jìn)一步封裝,支持form,也支持json,CSRF,文件上傳。我在項(xiàng)目里,頁面渲染和WebService都是用的這個(gè)插件。
例子:form.py
from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField
from wtforms.validators import Length, StopValidation
class MyForm(FlaskForm):
# 字段
name = StringField(validators=[Length(min=1, max=20, message="name長度需在1-20個(gè)字符間")])
name2 = IntegerField()
# 自定義驗(yàn)證
def validate_age(self, field):
# 根據(jù)name2查詢model
# ......
model = None
if not model:
# StopValidateion不需要自己捕捉
raise StopValidation("name2信息不存在")
view.py
@app.route('/api/get_obj_info', methods=["GET", "POST"]):
def get_obj_info():
form = MyForm()
if request.method == "GET":
return jsonify({
# xxxxx
})
# validate_on_submit 會(huì)自動(dòng)調(diào)用“validate_字段”這些驗(yàn)證方法
# 驗(yàn)證失敗后返回表單驗(yàn)證的錯(cuò)誤消息
if form.validate_on_submit():
return jsonify({
"status": "success",
"msg": "xxxx"
})
# 驗(yàn)證未通過
return jsonify({
"status": "failed":
"msg": "xxxx",
"error": form.errors
})
前臺(tái)POST數(shù)據(jù):
{
name: "小明",
name2: "管理"
}Wtforms的代碼可以hack一下,就可以做json數(shù)據(jù)校驗(yàn)了??梢钥催@里zerqu關(guān)于wtforms的使用。也可以在我正在聯(lián)手的項(xiàng)目中看到collector
class BaseForm(Form):
@classmethod
def create_api_json(cls, obj=None):
formdata = MultiDict(request.get_json())
form = cls(formdata=formdata, obj=obj, csrf_enabled=False)
if not form.validate():
raise FormError(form)
return form
def create(self):
pass
class NewsForm(BaseForm):
title = StringField(
label="標(biāo)題",
validators=[
DataRequired(),
Unique(News, News.title, '該條新聞標(biāo)題已經(jīng)存在')
]
)
url = StringField(
label="鏈接",
validators=[
DataRequired(),
URL(),
Unique(News, News.url, '該條新聞鏈接已經(jīng)存在')
]
)
tags = TagListField(label="標(biāo)簽")
site_id = IntegerField(label="站點(diǎn)ID")
site_name = StringField(label="站點(diǎn)名稱")
site_url = StringField(label="站點(diǎn)鏈接", validators=[])
created_at = DateTimeField(label="創(chuàng)建時(shí)間")
content = TextAreaField(label="正文")
content_html = TextAreaField(label="富文本正文")
## 使用
@app.route('/api/', methods=['POST'])
def post(self):
form = NewsForm.create_api_json()
item = form.create()
return jsonify(item) 以下是主要支持的library:
Request/Form Input:
Django
Webob (Includes Pylons, Google App Engine, Turbogears)
Werkzeug (Includes Flask, Tipfy)
any other cgi.FieldStorage-type multidict
Templating Engines:
Jinja2
Mako
Django Templates (To get the full power of WTForms in your templates, use WTForms-
Django.)
Genshi
所以如果你有自己的模板且在上面支持的列表里的話應(yīng)該稍作修改便可使用。如果你需要前后端分離的話,就不應(yīng)該用這種前后端一條龍的工具庫。如果是想用restful api的話,參考下django REST framework
如果要做前后端分離,做表單驗(yàn)證可以用這個(gè)marshmallow https://github.com/marshmallo...
marshmallow除了生成一個(gè)可讀性很好的類和驗(yàn)證該字段是不是類型符合以外,還支持序列化和反序列化的處理
http://www.dongwm.com/archive...
這里面有簡單的介紹
Flask RESTful API開發(fā)之序列化與反序列化
https://blog.igevin.info/post...
@apiv1.route('/login/', methods=['post'])
def login():
params_dict = {
'username': request.args.get('username', None),
'password': request.args.get('password', None),
}
# 驗(yàn)證數(shù)據(jù)
result, errors = UserValidation().load(params_dict)
if errors:
return jsonify({'code': 0, 'msg': errors})
count = User.select().where(
(User.username == params_dict['username']) & (User.password == params_dict['password'])).count()
if count > 0:
return jsonify({'code': 1, 'msg': '登錄成功'})
return jsonify({'code': 1, 'msg': '用戶名或者密碼錯(cuò)誤'})
UserValidation類
from marshmallow import Schema, fields, validates, ValidationError, post_load
class UserValidation(Schema):
"""
定義要驗(yàn)證的屬性
"""
username = fields.String(required=True)
password = fields.String(required=True)
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。