Fork me on GitHub

Flask的简单认识

Flask的简单认识

Flask是轻量级的框架,适用于简单的程序


与Django的比较:

Django: 无socket,中间件,路由,视图(CBV,FBV),模板,ORM, cookie,session,缓存,序列化,Form,信号.....

flask:  无socket,中间件(需要扩展),路由,视图(CBV,FBV),第三方模板(jinja2),cookie,session

Flask 的网络通信, 依赖于 werkzeug模块(实现了wsgi协议的模块 )

wsgi

    web 服务网关接口协议


请求    -->>	   socket接听     -->>  web应用

            实现wsgi协议的模块
            本质:创建socket监听请求和转发请求

Flask 的启动入口

wsgi.py

    from werkzeug.wrappers import Request, Response

    @Request.application
    def hello(request):
        return Response('Hello World!')

    if __name__ == '__main__':
        from werkzeug.serving import run_simple
        run_simple('localhost', 4000, hello)

flask

    from flask import Flask

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

    # 生成路由关系,并把关系保存到 app.url_map
    @app.route('/')
    def hello_world():
        return 'Hello World!'

    if __name__ == '__main__':
        app.run()

        # 启动程序,监听用户请求
        # 一旦请求到来,执行 app._ _call _ _方法
        # 封装用户请求
        # 进行路由匹配


>**Flask 的路由系统**

(1)装饰器与路由系统 捆绑到一起

常用

@app.route('/')
def hello_world():
    return 'Hello World!'

(2) app.add_url_rule('/','hello_world',hello_world)

  def hello_world():
      return 'Hello World!'

  app.add_url_rule('/','hello_world',hello_world)

( 3 ) 带参数的装饰器 -- flask 的路由系统

装饰器

    有参数的装饰器, 形成闭包 把参数传给inner使用

        @app.route('/')
        def hello_world():
            return 'Hello World!'

        def route(self, rule, **options):
            def decorator(f):
                endpoint = options.pop('endpoint', None)
                self.add_url_rule(rule, endpoint, f, **options)
                return f
            return decorator


    无参数的装饰器

        def wrapper(func):
            def inner(*args,**kwargs):
                print('hello')
                return func(*args,**kwargs)
            return inner

        @wrapper
        def func(arg):
            print(arg)

Flask 的 render_template

  导入
     from flask import render_template

  指定模板文件夹
     app = Flask(__name__,template_folder='templates',static_url_path='/static/',static_folder='static')

  返回数据给模板
     return render_template('login.html',msg=msg)

Flask 的 request

指定请求方式
    @app.route('/login',method=['GET','POST'])
    def login():
        return render_template('login.html')

request的数据
    print(request) #<Request 'http://127.0.0.1:5000/login' [POST]>
    print(request.query_string)
    print(request.args)   # get 请求的参数  
    print(request.values) # 全部的请求参数  CombinedMultiDict([ImmutableMultiDict([('v', '123')]), ImmutableMultiDict([])])
    print(request.form)   # post 请求的参数

Flask 的 静态文件

配置 static文件目录,和 path

   app = Flask(__name__,template_folder='templates',static_url_path='/static/',static_folder='static')

src
    "{{ url_for('static',filename='1.png') }}"
    "/static/1.png"

Flask 的 session -- secret key配置

session (所有的都放到浏览器) | django的session 是放在服务端
session_id -- cookie
        放在浏览器,减轻服务端压力


app.config['SECRET_KEY'] = 'sadsada2321312'  # 用serect_key 加盐加密

登录小 demo

from flask import Flask,render_template,request,session,redirect

app = Flask(__name__,template_folder='templates',static_url_path='/static/',static_folder='static')
app.config['SECRET_KEY'] = 'sadsada2321312'

@app.route('/',methods=['GET'])
def hello_world():
    user = session.get('user','')
    if user:
        return 'Hello World!'
    else:
        return redirect('/login')

@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        user = request.values.get('user')
        if user:
            session['user'] = user
            return redirect('/')
        else:
            msg = '用户名密码错误'
            return render_template('login.html',msg=msg)

if __name__ == '__main__':
    app.run()
posted @ 2018-03-09 17:43  派对动物  阅读(258)  评论(0编辑  收藏  举报
Top