flask基础

装饰器

概念

在不改变源码的前提下,对函数之前前后进行功能定制.

开放封闭原则:不改变函数内部代码,在函数外部进行修改.

基本写法

import functools

def wrapper(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        return func(*args, **kwargs)
    return inner


@wrapper
def index(xx):
    pass

@wrapper
def order(xx):
    pass

print(index.__name__) # "inner"
print(order.__name__) # "inner"

 

函数应用多个装饰器

import functools

def wrapper1(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        print('w1')
        return func(*args, **kwargs)
    return inner

def wrapper2(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        print('w2')
        return func(*args, **kwargs)
    return inner

@wrapper1
@wrapper2
def index():
    print('index')

index()

 

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比较好.

 

安装

pip3 install flask

 

werkzurg

werkzurg是一个wsgi,本质上提供了socket服务端,用于接收用户请求.

django和flask一样,它们内部都没有实现socket服务端,需要依赖wsgi.

  • django, wsgiref
  • flask, werkzurg

wsgiref实现一个网站(django)

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()

werkzeug实现一个网站(flask)

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)

 

flask程序

from flask import Flask

# 实例化了一个Flask对象
app = Flask(__name__)


# 添加路由关系
@app.route('/index')
def index():
    return '你好'


if __name__ == '__main__':
    # 启动服务端
    app.run()

 

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中. 
设置session的话,需要在
app = Flask(_name_)
app.secret_key = 'ssssss' #suibi'ssssss'
  • 在flask视图中添加装饰器
    • 位置route的下面
    • 记得加functools.wraps(...) , 保留函数的元信息.
  • 特殊装饰器:before和after request装饰器    

 

总结

  1. flask请求的生命周期
    1. wsgi, werkzeug模块
    2. before request
    3. 视图(业务/模板处理)
    4. after request
  2. 连接MySQL数据库,自己写pymysql
  3. 装饰器的应用场景
  4. django和flask的区别?
posted @ 2019-12-10 15:39  驰念  阅读(237)  评论(0编辑  收藏  举报