Flask初识
Flask初识
一丶Flask和Django比较
### Flask 是一个轻量级的框架. # 内置了: 路由 / 视图 / 模版(jinja2) / cookie /session 中间件 # 第三方插件: wtforms / flask-session / flask-sqlalchemy ### Django 是一个Django内置了许多的功能 # 内置了:admin / orm / 模版 / form / modelform / session / cookie / 缓存 /中间件 / 信号 / 数据库的读写分离 / 分页.... ### 总结: flask短小精悍,适合小程序开发 Django适合中大型程序开发
二丶Flask的‘入口’
# 1. 安装flask pip3 install flask
# 2. flask 的 werkzeug # werkzurg是一个wsgi,本质上提供了socket服务端,用于接收用户请求. # django和flask一样,它们内部都没有实现socket服务端,需要依赖wsgi.
# 3. werkzurg实现网站开发 from werkzeug.wrappers import Response from werkzeug.serving import run_simple class Flask(object): ''' # 面向对象的方式封装 ''' def __call__(self, *args, **kwargs): return Response('Hellow Werkzeug!!!') if __name__ == '__main__': app=Flask() run_simple('127.0.0.1',5000,app) # 第三个参数默认会加上括号执行,即调用类中的__call__方法
三丶Flask程序
from flask import Flask # 实例化一个app对象 app=Flask(__name__) # 添加路由关系 @app.route('/index') def index(): return 'hellow Flask' if __name__=='__main__': # 启动flask app.run()
四丶Flask的请求,路由,响应
# 接收请求 request # request.method 请求方法 # request.form post方法提交的数据 # request.args get方法提交的数据 # 返回响应 response # 返回字符串 return 'XXX' # 返回json return jsonify({"k1":123}) # 路由 , methods参数 @app.route('/login',methods=['GET','POST']) # 返回模版 render_template # 模版资源放在templates文件夹下 # return render_template('模板文件',参数) # 跳转 redict return redirect(...)
### 登录校验 # -*-coding:utf-8-*- # Author:Ds from flask import Flask, request, render_template, redirect, session, url_for import functools app=Flask(__name__) app.secret_key='1321312jkdsakljdls' def user_login_check(fn): @functools.wraps(fn) def inner(*args,**kwargs): print(inner) if not session.get('user-info'): return redirect(url_for('login')) return fn(*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=='123': session['user-info']=user return redirect('/index') return render_template('login.html',error="用户或密码错误!!") @app.route('/index',methods=['GET','POST']) @user_login_check def index(): # if not session.get('user-info'): # return render_template('login.html') data=['alex','wusir','taibai','bangzhu'] return render_template('index.html',data=data) @app.route('/order') @user_login_check def order(): return '订单' if __name__ == '__main__': app.run()
# 模版语法 1. 基本用法与Django一致 2. jinja2的语法更趋向于python语法
五丶session
# 已加密的形式放在用户的浏览器中 # 在flask中依赖secret_key,目的是保证session不被窃取
from flask import Flask, request, render_template, redirect, session, url_for import functools app=Flask(__name__) app.secret_key='1321312jkdsakljdls' @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=='123': # 设置session 的值 session['user-info']=user return redirect('/index')
六丶装饰器认证
# import functools - 位置route的下面 - 记得加functools.wraps(...) , 保留函数的元信息. def user_login_check(fn): @functools.wraps(fn) def inner(*args,**kwargs): print(inner) if not session.get('user-info'): return redirect(url_for('login')) return fn(*args,**kwargs) return inner # 总结: 如果不加functools.wraps,导致所有的函数名将会一致. 因为默认的endpoint将不能重名
# 必须先走路由 @app.route('/index',methods=['GET','POST']) @user_login_check def index(): # if not session.get('user-info'): # return render_template('login.html') data=['alex','wusir','taibai','bangzhu'] return render_template('index.html',data=data)
七丶flask的请求周期(充当中间件)
before_request : 把所有的方法添加到一个列表,按照注册的顺序执行 after_request : 把所有的方法 进行 reverse倒序后,再执行
# -*-coding:utf-8-*- # Author:Ds from flask import Flask, request, render_template, redirect, session, url_for app=Flask(__name__) app.secret_key='1321312jkdsakljdls' @app.before_first_request # 只调用一次 def f1(): print('f1') @app.before_request def f2(): print('f2') @app.after_request def f3(response): print('f3') return response @app.after_request def f4(response): print('f4') return response @app.route('/login',methods=['GET','POST']) def login(): print('login') return 'login' if __name__ == '__main__': app.run() # 结果: f1 f2 login f4 f3
相关推荐
bestallen 2020-08-17
JessePinkmen 2020-07-26
washing 2020-07-18
hzyuhz 2020-07-04
hzyuhz 2020-06-28
hzyuhz 2020-06-25
苦咖啡flask 2020-06-25
苦咖啡flask 2020-06-25
苦咖啡flask 2020-06-18
washing 2020-06-16
liuweiq 2020-06-14
wushaojun 2020-06-14
JessePinkmen 2020-06-14
kgshuo 2020-06-14
JessePinkmen 2020-06-14
bestallen 2020-06-13