在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  網(wǎng)絡(luò)安全  HTML/ Python Flask中表單驗(yàn)證的問題?

Python Flask中表單驗(yàn)證的問題?

最近在學(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: "管理"
    }
2017年4月13日 20:24
編輯回答
抱緊我

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)    
2017年12月8日 04:21
編輯回答
青瓷

以下是主要支持的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

2017年9月10日 09:11
編輯回答
伐木累

如果要做前后端分離,做表單驗(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)
2017年2月11日 15:12
編輯回答
命多硬

感覺題主想復(fù)雜了,把簡單的問題復(fù)雜化了。
既然想做前后端分離,就使用restful,直接拋棄jinja2,當(dāng)然,這樣的話也就無需使用wtforms了。然后,前端,后端各做個(gè)的表單驗(yàn)證即可。

2018年7月17日 07:55