清除页面缓存的方式:ctrl+f5

1、新的添加URL规则的方式

app.add_url_rule():

  1. @setupmethod
  2. def add_url_rule(
  3. self,
  4. rule,
  5. endpoint=None,
  6. view_func=None,
  7. provide_automatic_options=None,
  8. **options
  9. ):

1、@app.route(“URL地址”)

  1. from flask import Flask, url_for
  2. app = Flask(__name__)
  3. app.config['TEMPLATES_AUTO_RELOAD'] = True
  4. @app.route("/")
  5. def home():
  6. return "首页"
  7. if __name__ == "__main__":
  8. app.run(debug=True)

2、app.add_url_rule(“URL地址”, view_func=函数名),函数名不要加括号

  1. from flask import Flask, url_for, request, render_template, redirect
  2. app = Flask(__name__)
  3. app.config['TEMPLATES_AUTO_RELOAD'] = True
  4. def home():
  5. return "首页"
  6. app.add_url_rule("/", view_func=home)
  7. if __name__ == "__main__":
  8. app.run(debug=True)

此时,两种方式完成效果一致

2、app.add_url_rule()中关于endpoint参数的说明

endpoint相当于给路由起了一个别名,如app.add_url_rule(“/home/“, endpoint=’HOME’, view_func=view_home))中endpoint=’HOME’相当于给/home/起了一个别名为HOME
在未定义endpoint时,URL地址可以通过url_for(“函数名”)来进行获取,但是当定义了endpoint时,就只能通过url_for(“HOME”)进行获取URL地址
小例子:

  1. from flask import Flask, url_for
  2. app = Flask(__name__)
  3. app.config['TEMPLATES_AUTO_RELOAD'] = True
  4. @app.route("/")
  5. def home():
  6. print(url_for("VIEW"))
  7. return "首页"
  8. def view():
  9. return "这是view视图"
  10. app.add_url_rule("/view/", endpoint="VIEW", view_func=view)
  11. if __name__ == "__main__":
  12. app.run(debug=True)

如果在定义endpoint后,任然通过url_for(“函数名”)来获取URL地址,就会无情报错

3、类视图

前面学习的视图都是函数,所以简称为视图函数,但是视图也可以基于类来进行实现,类视图的好处是支持继承,但是类视图不能跟视图函数一样,写完类视图还需要通过app.add_url_rule(url_rule, view_func)来进行注册。
相关注意点:

  • 定义的类需要继承views.View类,并且需要通过from flask import views进行导入
  • 通过app.add_url_rule()进行注册是,需要通过as_view()来进行重命名,具体例子如下:

    1. app.add_url_rule('/view/', view_func=类名.as_view('new_name'))
  • 如果在app.add_url_rule()中写入endpoint属性,则通过url_for()获取URL地址的优先级为endpoint重命名(这是对URL进行重命名)优先于as_view重命名(这是对类进行重名名)的优先级,并且当写了endpoint参数时,url_for()就无法通过as_view重命名的名字来获取URL地址

  • 必须对dispatch_request()方法进行重写,因为父类views.View中定义了不重写就报错的异常
    1. def dispatch_request(self):
    2. """Subclasses have to override this method to implement the
    3. actual view function code. This method is called with all
    4. the arguments from the URL rule.
    5. """
    6. raise NotImplementedError()
    7. # 如果不进行重写就会报错
    小例子:
    代码部分: ```python from flask import Flask, views

app = Flask(name) app.config[‘TEMPLATES_AUTO_RELOAD’] = True

@app.route(“/“) def home(): return “首页”

class listview(views.View): def dispatch_request(self): return self.view()

  1. def view(self):
  2. return "这是一个类视图"

app.add_url_rule(‘/view/‘, endpoint=’VIEW’, view_func=listview.as_view(“vie”))

if name == “main“: app.run(debug=True)

  1. 网页显示:<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1227988/1587051119277-48829623-4d70-4dec-bfb5-a8b83f3c129d.png#align=left&display=inline&height=237&margin=%5Bobject%20Object%5D&name=image.png&originHeight=237&originWidth=430&size=25637&status=done&style=none&width=430)<br />此时如果要通过url_for来获取/view/, 应当通过endpoint参数来获取,url_for("VIEW")<br />如果不写endpoint参数,那么就能通过类名.as_view()重命名类的名字来获取url地址,url_for("vie")
  2. <a name="OCeQK"></a>
  3. ### 4、json文件的导入以及自定义NotImplementedError()
  4. 1json文件需要导入jsonify方法,from falsk import jsonify<br />2、可以通过raise NotlmplementedError()来自定义异常<br />代码部分:
  5. ```python
  6. from flask import Flask, views, jsonify
  7. app = Flask(__name__)
  8. app.config["TEMPLATES_AUTO_RELOAD"] = True
  9. class JsonView(views.View):
  10. # 重写dispatch_requeat()
  11. def dispatch_request(self):
  12. # 通过jsonify()来转化json数据
  13. json_file = self.get_json()
  14. return jsonify(json_file)
  15. # 需要对该方法进行重写
  16. def get_json(self):
  17. raise NotImplementedError()
  18. class ListView(JsonView):
  19. # 重写get_json()
  20. def get_json(self):
  21. return {"name": "流浪者、j"}
  22. app.add_url_rule("/listview/", view_func=ListView.as_view('LVW'))
  23. if __name__ == "__main__":
  24. app.run(debug=True)

页面显示:
image.png

5、通过类定义公有变量

代码部分:

  1. from flask import Flask, render_template, views
  2. app = Flask(__name__, template_folder="templates")
  3. app.config["TEMPLATES_AUTO_RELOAD"] = True
  4. @app.route("/")
  5. def home():
  6. return "首页"
  7. class MainView(views.View):
  8. def __init__(self):
  9. super(views.View, self).__init__()
  10. self.dic = {
  11. "name1": "流浪者、j",
  12. "age1": "18",
  13. "name2": "十三桐人",
  14. "age2": "20"
  15. }
  16. class SecondView(MainView):
  17. def dispatch_request(self):
  18. return render_template("view1.html", **self.dic)
  19. class ThreeView(MainView):
  20. def dispatch_request(self):
  21. return render_template("view2.html", **self.dic)
  22. app.add_url_rule("/view1/", view_func=SecondView.as_view("v1"))
  23. app.add_url_rule("/view2/", view_func=ThreeView.as_view("v2"))
  24. if __name__ == "__main__":
  25. app.run(debug=True, port=50)

macro.html

  1. {% macro information(name, age) %}
  2. <p>{{ name }}</p>
  3. <p>{{ age }}</p>
  4. {% endmacro %}

view1.html

  1. {% import "macro.html" as macro with context %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>mainview2</title>
  7. </head>
  8. <body>
  9. {{ macro.information(name1, age1) }}
  10. </body>
  11. </html>

view2.html

  1. {% import "macro.html" as macro with context %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>mainview2</title>
  7. </head>
  8. <body>
  9. {{ macro.information(name2, age2) }}
  10. </body>
  11. </html>

页面显示:
image.png
image.png