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如绿色箭头所示。

原文地址:https://www.cnblogs.com/ttyypjt/p/11038196.html