1、新的添加URL规则的方式
app.add_url_rule():
@setupmethoddef add_url_rule(self,rule,endpoint=None,view_func=None,provide_automatic_options=None,**options):
1、@app.route(“URL地址”)
from flask import Flask, url_forapp = 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, redirectapp = Flask(__name__)app.config['TEMPLATES_AUTO_RELOAD'] = Truedef 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_forapp = 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 theactual view function code. This method is called with allthe 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 />代码部分:```pythonfrom flask import Flask, views, jsonifyapp = Flask(__name__)app.config["TEMPLATES_AUTO_RELOAD"] = Trueclass 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, viewsapp = 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>
页面显示:

