1.flask基礎
阿新 • • 發佈:2019-12-11
1.flask和django的區別?
flask,是一個輕量級的框架,內建了:路由/檢視/模板(jinja2)/cookie/session/中介軟體. 可擴充套件強,第三方元件非常多,例如:wtforms/flask-session/flask-sqlalchemy.
django,是一個重武器,django內建了很多功能方便我們使用,例如:admin/orm/模板/form/modelform/session/cookie/中介軟體/路由/快取/訊號/資料庫的讀寫分離/分頁...
flask,短小精悍可擴充套件強.
django,大而全重武器.
django好還是flask好?
小程式,flask比較好. 中大型,django比較好.
2.快速入門
pip3 install flask
2.1 werkzurg
werkzurg是一個wsgi,本質上提供了socket服務端,用於接收使用者請求.
django和flask一樣,它們內部都沒有實現socket服務端,需要依賴wsgi.
- django, wsgiref
- flask, werkzurg
2.1.1 wsgiref實現一個網站
from wsgiref.simple_server import make_server class WSGIHandler(object): def __call__(self,environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] if __name__ == '__main__': obj = WSGIHandler() httpd = make_server('127.0.0.1', 8000, obj) httpd.serve_forever()
2.1.2 werkzeug實現一個網站
from werkzeug.wrappers import Response from werkzeug.serving import run_simple class Flask(object): def __call__(self,environ, start_response): return Response('Hello World!')(environ, start_response) if __name__ == '__main__': app = Flask() run_simple('127.0.0.1', 5000, app)
2.2flask程式
from flask import Flask
# 例項化了一個Flask物件
app = Flask(__name__)
# 新增路由關係
@app.route('/index')
def index():
return '你好'
if __name__ == '__main__':
# 啟動服務端
app.run()
3.flask使用者登入例項
關於返回值
from flask import Flask,render_template,request,redirect app = Flask(__name__) @app.route('/login',methods=['GET','POST']) def login(): return "xxx" return render_template('模板檔案',引數) return redirect(...) return jsonify({"k1":123}) if __name__ == '__main__': app.run()
關於模板
預設放在根目錄的tempaltes
關於使用者請求
request.method request.form # POST request.args # GET
session
加密的形式放在使用者瀏覽器的cookie中. from flask import Flask,render_template,request,redirect,jsonify,url_for,session app.secret_key = "29ualknd872iuknsdgf" def auth(func): @functools.wraps(func) def inner(*args,**kwargs): user = session.get('user_info') if not user: return redirect(url_for('login')) return func(*args,**kwargs) return inner @app.route('/login',methods=['GET','POST']) def login(): if request.method == 'GET': return render_template('login.html') user = request.form.get('user') pwd = request.form.get('pwd') if user == 'alex' and pwd == 'dsb': # 在session中儲存一個值 session['user_info'] = user return redirect(url_for('index')) return render_template('login.html',error="使用者名稱或密碼錯誤")
在flask檢視中新增裝飾器
位置route的下面
記得加functools.wraps(...) , 保留函式的元資訊.
from flask import Flask,render_template,request,redirect,jsonify,url_for,session app.secret_key = "29ualknd872iuknsdgf" def auth(func): @functools.wraps(func) def inner(*args,**kwargs): user = session.get('user_info') if not user: return redirect(url_for('login')) return func(*args,**kwargs) return inner @app.route('/index') @auth def index(): user_list = ["莊伯","亮哥",'實驗'] user_info_list = [ {"name":'莊伯','age':18}, {"name":'亮哥','age':15}, {"name":'實驗','age':18}, ] return render_template('index.html',user_list=user_list,user_info_list=user_info_list)
特殊裝飾器:before和after request裝飾器
from flask import Flask,render_template,request,redirect,jsonify,url_for,session import functools app = Flask(__name__) app.secret_key = "29ualknd872iuknsdgf" @app.before_request def f1(): print('f1') @app.before_request def f11(): print('f11') @app.after_request def f2(response): print('f2') return response @app.after_request def f22(response): print('f22') return response @app.route('/login') def login(): print('login') return 'Login' @app.route('/index') def index(): print('index') return 'index' if __name__ == '__main__': app.run() ''' f1 f11 login f22 f2 '''