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

相关推荐