1、views.MethodView

flask提供的基于调度方法的视图,可以对每个HTTP请求方式执行不同的函数(映射到对应方法的小写的同名方法(post\get)上)
一个小例子:

  1. from flask import Flask, views, render_template, request
  2. app = Flask(__name__)
  3. app.config["TEMPLATES_AUTO_RELOAD"] = True
  4. # views.MethodView中不需要,像views.View中需要重写dispatch_request
  5. class ModView(views.MethodView):
  6. def get(self, arg=""):
  7. return render_template("method.html", arg=arg)
  8. def post(self):
  9. name = request.form.get("name")
  10. password = request.form.get("password")
  11. # 在实际开发中此时应当查询数据库
  12. if name == "liu" or password == "123":
  13. # return self.get()
  14. return "登录成功"
  15. else:
  16. return self.get(arg="账户密码错误")
  17. app.add_url_rule("/", view_func=ModView.as_view("home"))
  18. if __name__ == "__main__":
  19. app.run(debug=True)

method.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>method</title>
  6. </head>
  7. <body>
  8. {% macro input(name, value="", type="text") %}
  9. <input name="{{ name }}", value="{{ value }}", type="{{ type }}">
  10. {% endmacro %}
  11. <table>
  12. <tr>
  13. <td>用户名:</td>
  14. <td>{{ input('username') }}</td>
  15. </tr>
  16. <tr>
  17. <td>密码:</td>
  18. <td>{{ input('password', type="password") }}</td>
  19. </tr>
  20. <tr>
  21. <td>确定:</td>
  22. <td>{{ input(value="登录", type="submit") }}</td>
  23. </tr>
  24. </table>
  25. <p>{{ arg }}</p>
  26. </body>
  27. </html>

页面返回:
image.png

2、使用装饰器装饰类视图

类视图有一个缺陷就是比较难用装饰器进行装饰
1、一个小例子:视图函数的装饰器
完成功能,如果用户没有输入用户名,那么就进入要进行登录,如果写了用户名,就进入个人中心

  1. from flask import Flask, request, redirect, url_for
  2. app = Flask(__name__)
  3. app.config["EMPLATES_AUTO_RELOAD"] = True
  4. def decorate(func):
  5. def make(*args, **kwargs):
  6. username = request.args.get("username")
  7. if username:
  8. return func(*args, **kwargs)
  9. else:
  10. return redirect(url_for("logic"))
  11. return make
  12. @app.route("/")
  13. @decorate
  14. def home():
  15. return "个人中心"
  16. @app.route("/logic/")
  17. def logic():
  18. return "请先登录"
  19. if __name__ == "__main__":
  20. app.run(debug=True)

页面显示:输入http://127.0.0.1:5000/?username=123
image.png
页面显示:输入http://127.0.0.1:5000/
image.png
2、在类视图中完成相同操作
代码部分:

  1. from flask import Flask, request, redirect, url_for, views
  2. app = Flask(__name__)
  3. app.config["EMPLATES_AUTO_RELOAD"] = True
  4. def decorate(func):
  5. def make(*args, **kwargs):
  6. username = request.args.get("username")
  7. if username:
  8. return func(*args, **kwargs)
  9. else:
  10. return redirect(url_for("logic"))
  11. return make
  12. class Home(views.View):
  13. # 类的装饰器需要通过decorators进行接收,可以写多个装饰器,写在列表中即可
  14. # 写入装饰器名称,不需要写@符
  15. decorators = [decorate]
  16. def dispatch_request(self):
  17. return "个人中心"
  18. @app.route("/logic/")
  19. def logic():
  20. return "请先登录"
  21. app.add_url_rule('/', view_func=Home.as_view("home"))
  22. if __name__ == "__main__":
  23. app.run(debug=True)

注意点:

  • 通过decorators属性进行接收装饰器
  • 由于decotators属性是一个列表,所以可以传入多个装饰器,不需要引号不需要@

    3、拓展-权限认证

    虽然和上面的意思一致,但是可以了解一下session
    1. from flask import session
    2. def login_required(func):
    3. def wrapper(*args,**kwargs):
    4. if not session.get("user_id"):
    5. return 'auth failure'
    6. return func(*args,**kwargs)
    7. return wrapper