flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...
生活随笔
收集整理的這篇文章主要介紹了
flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
flask中的CBV ,?flask-session在redis中存儲session ,?WTForms數據驗證 , 偏函數 , 對象里的一些小知識 flask中的CBV寫法 后端代碼 # 導入views from flask import Flask, render_template, views, request app = Flask(__name__) # CBV寫法 class Login(views.MethodView):? ? ? ?# 定義一個類,不用裝飾器,繼承了MethodView就不用寫methods=['GET', 'POST']了 def get(self): ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? ?? # 函數就是類里面的方法 return render_template("login.html")?? ? # get請求進來返回login頁面 def post(self): # post請求 my_file = request.files.get("MyFile")? ??# 用request取出MyFile(MyFile是前端頁面選取的文件),然后賦值給my_file my_file.save(my_file.filename) # 把選取的文件保存下下來 return "123" app.add_url_rule("/login", view_func=Login.as_view(name='login')) if __name__ == '__main__': app.run("0.0.0.0", 9527, debug=True) 前端代碼 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="text" name="username"> <input type="file" name="MyFile"> <input type="submit" value="登錄"> </form> </body> </html> flask-session在redis中存儲session 后端代碼 from flask import Flask, request, render_template, session from flask_session import Session from redis import Redis # flask-session在redis中存儲session app = Flask(__name__) app.config["DEBUG"] = True app.config["SESSION_TYPE"] = "redis"??# session存儲格式為redis app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379)??# redis的服務器參數, ip 和 端口 app.config["SESSION_COOKIE_NAME"] = "#¥%……&*(#E$RTY$%RTY%^Y&U%^&*" Session(app) @app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "GET": return render_template('login.html') else: session['user'] = request.form.get('username') return str(session['user']) if __name__ == '__main__': app.run() 前端代碼 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="text" name="username"> <input type="file" name="MyFile"> <input type="submit" value="登錄"> </form> </body> </html> WTForms WTForms是一個支持多個web框架的form組件,主要用于對用戶請求數據進行驗證。 登錄和注冊驗證 例: from flask import Flask, request, render_template, session from flask_session import Session from redis import Redis from wtforms import Form, validators, widgets from wtforms.fields import simple, core app = Flask(__name__) app.config["DEBUG"] = True app.config["SESSION_TYPE"] = "redis"??# session存儲格式為redis app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379)??# redis的服務器參數, ip 和 端口 app.config["SESSION_COOKIE_NAME"] = "#¥%……&*(#E$RTY$%RTY%^Y&U%^&*" Session(app) # 登錄錯誤提示類 class LoginForm(Form): username = simple.StringField( label='用戶名', validators=[ validators.DataRequired(message='用戶名不能為空'), validators.Length(min=4, max=8, message='用戶名必須大于等于4,小于等于8') ] ) password = simple.PasswordField( label='密碼', validators=[ validators.DataRequired(message='密碼不能為空'), validators.Length(min=4, max=8, message='密碼長度必須大于等于4,小于等于8') ] ) # 登錄校驗代碼 @app.route("/login", methods=["GET", "POST"]) def login(): login_form = LoginForm() if request.method == "GET": return render_template('login.html', lf=login_form) else:??# 這里就相當于是post請求了 login_form_data = LoginForm(request.form)??# request.form中的form就是formdata ,就是前段頁面提交過來的數據,把數據序列化給login_form_data if login_form_data.validate():??# 校驗數據 session['user'] = login_form_data.data.get('username')??# 校驗成功后從data中拿數據 return str(session['user']) else:??# 如果校驗失敗,返回下面內容(lf??錯誤的數據) return render_template('login.html', lf=login_form_data) # 注冊錯誤提示或限制類 class RegForm(Form):??# 繼承Form username = simple.StringField( label='用戶名', validators=[ validators.DataRequired(message='用戶名不能為空') ], render_kw={'class': "my_class"} ) password = simple.PasswordField( label='密碼', validators=[ validators.Length(min=6, max=16, message='密碼長度應該大于或等于6,小于或等于16') ] ) repassword = simple.PasswordField( label='確認密碼', validators=[ validators.EqualTo('password', message='兩次密碼不一致') ] ) gender = core.SelectField( label='性別', choices=( (1, '女'), (2, '男') ), default=1, render_kw={'class': 'my_class'}, coerce=int ) email = simple.StringField( label='郵箱', validators=[ validators.DataRequired(message='郵箱不能為空'), validators.Email(message='不符合規定') ] ) hobby = core.SelectMultipleField( label='愛好', choices=( (1, '蘿莉'), (2, '小阿姨'), (3, '大姐姐'), (4, '小姐姐') ), coerce=int, default=(1, 4) ) # 注冊校驗代碼 @app.route('/reg', methods=['GET', 'POST']) def reg(): if request.method == 'GET':?????????# 此時是'GET'請求 rf = RegForm()??????# 把RegForm這個類賦值給rf , 此時這個類里面是沒有數據的,因為還沒有注冊,只是一個注冊的前端頁面 return render_template('reg.html', rf=rf)???????# 跳轉到reg.html , 帶上rf填充注冊的前端頁面 else:???????# 'POST'請求的時候 rf_data = RegForm(request.form)?????# 這里取出來的就是formData數據,把數據交給rf_data if rf_data.validate():??????????????#校驗數據 # print(rf_data.data.get('hobby')) # print(type(rf_data.data.get('gender'))) return '注冊成功'?????????????# 校驗通過返回這個HttpResponse else: return render_template('reg.html', rf=rf_data)??????# 校驗不通過還是跳轉到注冊頁面,不同的是帶上了錯誤信息 if __name__ == '__main__': app.run() 偏函數 # 偏函數 from functools import partial def my_sum(a, b): print(a) print(b) return a + b # 注意: 依然遵守傳參規范,位置參數不能不能出現在關鍵字參數后面 # new_my_sum = partial(my_sum, 10, b=20) new_my_sum = partial(my_sum, 10)??# 按位置傳參這個10傳給a了, b的參數也能在這里傳(my_sum, 10, 20),這里如果傳了兩個參數了那么 res = new_my_sum(20)這里就不用傳參了 # 此時的new_my_sum里面應該是下面這樣的 # new_my_sum # def my_sum(b): #?????a = 10 # 上面如果把兩個參數都傳了這里就不用傳參了 # res = new_my_sum() res = new_my_sum(20)??# 此時a已經有參數了,這個20就傳給b了 print(res)??# res接收return返回的值 對象里面的一些小知識 class MyClass(object): def __call__(self, *args, **kwargs): print(666) def __setattr__(self, key, value): print(key, value) def __getattr__(self, item): print(item) def __setitem__(self, key, value): print(key, value, 'item') def __getitem__(self, item): print(item, 'item') def func(): return 123 a = MyClass()??# 類名加括號是實例化一個對象 # a()????????????????# 對象加括號執行了類里面的__call__方法 # a.name = '小昭' # a['name'] = '小昭'????# 添加item通過 對象,中括號 用的是 __setitem__ 方法 # a["my name is name"]??# 取item 通過 對象,中括號,索引 用的是 __getitem__ 方法 # a.name = "趙麗穎"????# 通過 對象 . 的方式添加item用的是 __setattr__ 方法 # a.mynameissetattr???# 通過 對象 . 的方式取item用的是 __getattr__ 方法
轉載于:https://www.cnblogs.com/hdy19951010/p/10447222.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#实现代码生成器
- 下一篇: 运行 vue 报node错