zoukankan      html  css  js  c++  java
  • flask基本使用1

    一、flask获取以及传递参数给浏览器

    request.args # get方法获取参数
    request.form # post方法获取参数
    
    传递参数(与django只能传递字典有些不同)
    request render_template("login.html", error="y用户名或密码错误")
    request render_template("login.html", **{"error":"y用户名或密码错误"})

    二、flask自设置配置文件

    app.py程序文件
    
    from flask import Flask, render_template, request,redirect, session
    
    app = Flask(__name__)
    
    app.config.from_object("settings.Dev")
    
    if __name__ == '__main__':
        app.run()
    
    # from_object引用配置文件里的配置。
    
    
    settings.py配置文件
    
    class Base:
        DEBUG = True
    
    class Dev(Base):
        DEBUG = True
        TEST = True
    
    class Pro(Base):
        DEBUG = False
        TEST = False
    
    
    # settings.py配置文件设置基本的参数,不同环境再通过继承的方式修改或添加相应的配置,不同的环境可通过class的名称区分。

    三、flask的路由

    反射生成url(endpoint+url_for)

    from flask import Flask
    from flask import url_for
    
    app = Flask(__name__)
    
    @app.route("/index",methods=["GET"],endpoint="n1")
    def index():
        print(url_for("n1"))
        return "index"
    
    或者不写endpoint,直接指向函数名称
    @app.route("/index",methods=["GET"])
    def index():
        print(url_for("index"))
        return "index"
    
    # flask的endpoint相当于django urls.py文件中的name,url_for相当于reverse

    四、url传参

    from flask import Flask, render_template, request,redirect, session, url_for
    
    app = Flask(__name__)
    
    app.config.from_object("settings.Dev")
    
    @app.route("/index/<int:nid>",methods=["GET"])
    def index(nid):
        print(nid) # 直接取出参数
        print(url_for("index", nid=777)) # 取出参数后,再加上反射
        return "index"
    
    # 访问http://127.0.0.1:5000/index/1111111
    # console返回
        1111111
        /index/777
    默认有以下五种传参方式
    @app.route("<str>")
    @app.route("<int:nid>")
    @app.route("<float:post_id>")
    @app.route("<path:path>")
    @app.route("/login",methods=["GET","POST"])
    
    # django2.0以后同样也可采用此方式

     请求的基本参数

    # 请求相关信息
    # request.method
    # request.args
    # request.form
    # request.values
    # request.cookies
    # request.headers
    # request.path
    # request.full_path
    # request.script_root
    # request.url
    # request.base_url
    # request.url_root
    # request.host_url
    # request.host
    # request.files
    # obj = request.files['the_file_name']
    # obj.save('/var/www/uploads/' + secure_filename(f.filename))

    五、响应头

    返回json
    obj = {"id":1,"name":"jack"}
    return josonify(obj)
    
    自定制响应头
    obj = make_respone("")
    obj.headers["xxxx"] = 123
    return obj
    # 在response header中添加自定义响应头
    
    设置cookie
    @app.route('/set_cookie')  
    def set_cookie():  
        response=make_response('Hello World');  
        response.set_cookie('Name','Hyman')  
        return response
    #获取cookie
    @app.route('/get_cookie')
    def get_cookie():
      name = request.cookies.get('passwd')
      return name

    #删除cookie
    @app.route('/del_cookie')
    def del_cookie():
      resp = make_response('delete_cookie')
      resp.delete_cookie('passwd')
      return resp 
     
    #设置cookie
    @app.route('/set_cookie')
    def set_cookie():
      resp = make_response('set_cookie')
      resp.set_cookie('passwd', '123456')
      return resp

    六、添加登陆

    版本一:# 一般不用
       @app.route('/index')
       def index():
          if not session.get('user'):
             return redirect(url_for('login'))
          return render_template('index.html',stu_dic=STUDENT_DICT)
    版本二:# 如果需要对个别地址添加登陆,需要使用此方法
       import functools
       def auth(func):
          @functools.wraps(func) # 将装饰的方法的属性返回,而不是返回装饰器内部函数的属性
          def inner(*args,**kwargs):
             if not session.get('user'):
                return redirect(url_for('login'))
             ret = func(*args,**kwargs)
             return ret
          return inner
    
       @app.route('/index')
       @auth
       def index():
          return render_template('index.html',stu_dic=STUDENT_DICT)
    
       应用场景:比较少的函数中需要额外添加功能。
       
    版本三:before_request
       @app.before_request
       def xxxxxx():
          if request.path == '/login':
             return None
    
          if session.get('user'):
             return None
    
          return redirect('/login')

    七、session

    当请求刚到来:flask读取cookie中session对应的值:eyJrMiI6NDU2LCJ1c2VyIjoib2xkYm95,将该值解密并反序列化成字典,放入内存以便视图函数使用。
    视图函数:
       @app.route('/ses')
       def ses():
          session['k1'] = 123
          session['k2'] = 456
          del session['k1']
          return "Session"

     当请求结束时,flask会读取内存中字典的值,进行序列化+加密,写入到用户cookie中。

    八、闪现

    在session中存储一个数据,在取出时,用pop取出并且移除;可以将数据分组,并且按照分组取出
    from flask import flash, get_flashed_messages
    @app.route("/f1")
    def fla():
        flash("这是一个闪现","error")
        flash("hahahha","error")
        flash("123123123","info")
        return "flash1"
    
    @app.route("/f2")
    def fla2():
        print(get_flashed_messages(category_filter=["error"]))
        print("--------------------------")
        return "flash2"
    
    先访问/f1,在访问/f2
    返回结果:
        ["这是一个闪现","hahahha"]

    九、中间件

    - call方法,当用户发起请求时候,执行__call__方法,此前一直处于端口监听状态

    class Middleware(object):
        def __init__(self,old):
            self.old = old
    
        def __call__(self, *args, **kwargs):
            ret = self.old(*args, **kwargs)
            return ret
    
    if __name__ == '__main__':
        app.wsgi_app = Middleware(app.wsgi_app)
        app.run()
    
    # 将flask的wsgi继承,并重新修饰

    常见的中间件

    - before_request # 谁先定义,谁先执行
    - after_request # 谁后定义,谁先执行
    - before_first_request # 在函数处理前执行,只执行一次
    - template_global
    - template_filter
    - errorhandler(404)

    # 一个请求处理中,中间件可以有多个before_request和after_request

    flask中before_request和after_request的执行顺序。

    django1.10之前,如果x1直接return返回结果,中间件的执行顺序和flask相同,>=1.10之后,对请求的处理如紫色箭头表示,flask如绿色箭头所示。

  • 相关阅读:
    约瑟夫问题的解法集锦
    java调用com组件将office文件转换成pdf
    hdu(1069)——Monkey and Banana(LIS变形)
    Unix网络编程之环境搭建
    atitit. java queue 队列体系and自己定义基于数据库的队列总结o7t
    怎样使Dialog像Activity一样随心所欲的使用?
    获取全部分组中某列最大的行
    Class C++
    spring mvc +Mybatis3.1 整合的时候异常
    Linux 编译C++ 与 设置 Vim
  • 原文地址:https://www.cnblogs.com/ttyypjt/p/11038196.html
Copyright © 2011-2022 走看看