1、新的添加URL规则的方式
app.add_url_rule():
@setupmethod
def add_url_rule(
self,
rule,
endpoint=None,
view_func=None,
provide_automatic_options=None,
**options
):
1、@app.route(“URL地址”)
from flask import Flask, url_for
app = Flask(__name__)
app.config['TEMPLATES_AUTO_RELOAD'] = True
@app.route("/")
def home():
return "首页"
if __name__ == "__main__":
app.run(debug=True)
2、app.add_url_rule(“URL地址”, view_func=函数名),函数名不要加括号
from flask import Flask, url_for, request, render_template, redirect
app = Flask(__name__)
app.config['TEMPLATES_AUTO_RELOAD'] = True
def home():
return "首页"
app.add_url_rule("/", view_func=home)
if __name__ == "__main__":
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地址
小例子:
from flask import Flask, url_for
app = Flask(__name__)
app.config['TEMPLATES_AUTO_RELOAD'] = True
@app.route("/")
def home():
print(url_for("VIEW"))
return "首页"
def view():
return "这是view视图"
app.add_url_rule("/view/", endpoint="VIEW", view_func=view)
if __name__ == "__main__":
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()来进行重命名,具体例子如下:
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中定义了不重写就报错的异常
小例子:def dispatch_request(self):
"""Subclasses have to override this method to implement the
actual view function code. This method is called with all
the arguments from the URL rule.
"""
raise NotImplementedError()
# 如果不进行重写就会报错
代码部分: ```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()
def view(self):
return "这是一个类视图"
app.add_url_rule(‘/view/‘, endpoint=’VIEW’, view_func=listview.as_view(“vie”))
if name == “main“: app.run(debug=True)
网页显示:<br /><br />此时如果要通过url_for来获取/view/, 应当通过endpoint参数来获取,url_for("VIEW")<br />如果不写endpoint参数,那么就能通过类名.as_view()重命名类的名字来获取url地址,url_for("vie")
<a name="OCeQK"></a>
### 4、json文件的导入以及自定义NotImplementedError()
1、json文件需要导入jsonify方法,from falsk import jsonify<br />2、可以通过raise NotlmplementedError()来自定义异常<br />代码部分:
```python
from flask import Flask, views, jsonify
app = Flask(__name__)
app.config["TEMPLATES_AUTO_RELOAD"] = True
class JsonView(views.View):
# 重写dispatch_requeat()
def dispatch_request(self):
# 通过jsonify()来转化json数据
json_file = self.get_json()
return jsonify(json_file)
# 需要对该方法进行重写
def get_json(self):
raise NotImplementedError()
class ListView(JsonView):
# 重写get_json()
def get_json(self):
return {"name": "流浪者、j"}
app.add_url_rule("/listview/", view_func=ListView.as_view('LVW'))
if __name__ == "__main__":
app.run(debug=True)
5、通过类定义公有变量
代码部分:
from flask import Flask, render_template, views
app = Flask(__name__, template_folder="templates")
app.config["TEMPLATES_AUTO_RELOAD"] = True
@app.route("/")
def home():
return "首页"
class MainView(views.View):
def __init__(self):
super(views.View, self).__init__()
self.dic = {
"name1": "流浪者、j",
"age1": "18",
"name2": "十三桐人",
"age2": "20"
}
class SecondView(MainView):
def dispatch_request(self):
return render_template("view1.html", **self.dic)
class ThreeView(MainView):
def dispatch_request(self):
return render_template("view2.html", **self.dic)
app.add_url_rule("/view1/", view_func=SecondView.as_view("v1"))
app.add_url_rule("/view2/", view_func=ThreeView.as_view("v2"))
if __name__ == "__main__":
app.run(debug=True, port=50)
macro.html
{% macro information(name, age) %}
<p>{{ name }}</p>
<p>{{ age }}</p>
{% endmacro %}
view1.html
{% import "macro.html" as macro with context %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>mainview2</title>
</head>
<body>
{{ macro.information(name1, age1) }}
</body>
</html>
view2.html
{% import "macro.html" as macro with context %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>mainview2</title>
</head>
<body>
{{ macro.information(name2, age2) }}
</body>
</html>
页面显示: