flask路由之app.add_url_rule('/index/', endpoint='I', view_func=index)
1.add_url_rule函数
之前我们接触的视图都是函数,所以一般简称视图函数。其实视图也可以基于类来实现,类视图的好处是支持继承,但是类视图不能跟函数视图一样,写完类视图还需要通过app.add_url_rule()函数来进行注册。
app.add_url_rule(rule, endpoint=None, view_func=None)函数中,rule参数表示路由路径,如“/”;endpoint参数输入值为字符串,默认为None,该参数会替换路由地址的名称;view_func参数表示指定的视图函数。例如
原文链接:https://blog.csdn.net/ForsetiRe/article/details/105542423/
#_*_ encoding: utf-8 _*_ @author: ty hery 2019/12/20
# https://blog.csdn.net/ForsetiRe/article/details/105542423/
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/helloworld/')
def hello_world():
print(url_for('I')) # 因为endpoint参数为’I‘,所以若要获取/index/的路由地址,url_for()中的参数应该为endpoint参数值
return 'Hello World!'
def index():
print(url_for('hello_world')) # 打印视图函数hello_world()的路由地址
return '首11页11234'
app.add_url_rule('/index/', endpoint='I', view_func=index) # 指定index()视图函数的路由地址为’/index/‘
if __name__ == '__main__':
app.run(debug=True)
这样,我们就可以在“/index/”路由路径中看到index视图函数的内容了。
2.类视图
2.1.标准类视图
标准类视图是继承自flask.views.View,并且在子类中必须实现dispatch_request()方法,这个方法类似于视图函数,也要返回一个基于Response或者其子类的对象。例如,
from flask import Flask, views
app = Flask(__name__)
class IndexView(views.View): # 标准类视图继承于views.View
def dispatch_request(self): # dispatch_request(self)方法为必须要写的方法,类似于视图函数
return '首页'
app.add_url_rule('/', view_func=IndexView.as_view('indexview')) # view_func参数值为 类视图名.as_view(指定名称)
if __name__ == '__main__':
app.run(debug=True)
通过这种方法,我们就可以在“/”路由路径中看到类视图的内容了。因为,类视图的优势在继承方面,我们下面来写一个简单的类视图继承的例子。
新建一个app.py实例文件,代码如下,
from flask import Flask, views, render_template
app = Flask(__name__)
class CommonView(views.View):
def __init__(self):
self.context = {
'name': 'zhangsan',
'age': 18
}
class RegisterView(CommonView):
def dispatch_request(self):
self.context.update({
'password': 'fawaikuangtu'
}) # 更新context
return render_template('register.html', **self.context)
class LoginView(CommonView):
def dispatch_request(self):
return render_template('login.html', **self.context)
app.add_url_rule('/register/', view_func=RegisterView.as_view('registerview')) # 注册
app.add_url_rule('/login/', view_func=LoginView.as_view('loginview')) # 注册
if __name__ == '__main__':
app.run(debug=True)
新建register.html文件,代码如下,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<table>
<tbody>
<tr>
<td>用户名:</td>
<td><input type="text" value="{{ name }}"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" value="{{ password }}"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交"></td>
</tr>
</tbody>
</table>
</body>
</html>
————————————————
版权声明:本文为CSDN博主「ForsetiRe」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ForsetiRe/article/details/105542423/
新建login.html文件,代码如下,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<h3>{{ name }},欢迎登陆</h3>
</body>
</html>
原文链接:https://blog.csdn.net/ForsetiRe/article/details/105542423/
我们可以看到,RegisterView和LoginView继承与CommonView,因此同时通过继承获取到了context的内容,这样RegisterView和LoginView只需对context内容进行处理。
2.2.基于调度方法的视图
Flask还为我们提供了另外一种类视图flask.views.MethodView,对每个HTTP方法执行不同的函数(映射到对应方法的小写的同名方法上)。
下面我们来模拟一个登录页面,该登陆页面通过GET方式访问时,会需要用户输入用户名和密码并提交,提交后会自动跳转到首页。
这个例子中,我们的类视图需要继承views.MethodView,之后需要自定义get()方法和post()方法。get()方法会在用户使用GET方式访问时调用,而post()方法会在用户使用POST方式访问时调用。
首先,新建一个实例文件app.py,代码如下,
from flask import Flask, views, render_template, request
app = Flask(__name__)
class LoginView(views.MethodView):
def get(self):
return render_template('login.html', error=None) # 传递error值,用来显示错误信息
def post(self):
username = request.form.get('username') # 获取表单中的username值
password = request.form.get('password') # 获取表单中的password值
context = {
'username': username,
'password': password
}
if username and password:
return render_template('index.html', **context)
else:
return render_template('login.html', error='请输入用户名和密码') # username或password为空时,返回login.html页面,并显示错误信息error
app.add_url_rule('/login/', view_func=LoginView.as_view('loginview')) # 注册
if __name__ == '__main__':
app.run(debug=True)
login.html代码如下,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆页面</title>
</head>
<body>
<form action="" method="post"> // 指定方法为post
<table>
<tbody>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交"></td>
</tr>
{% if error %} // 如果error值为空,则不显示,否则显示error值
<div style="color: red">{{ error }}</div>
{% endif %}
</tbody>
</table>
</form>
</body>
</html>
index.html代码如下,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h3>{{ username }},欢迎登陆</h3>
</body>
</html>
2.3.类视图装饰器
对于一些需要提前登录才能查看的页面,我们需要验证用户是否登录。这里,我们可以使用类视图装饰器完成。没看懂
例如,
from flask import Flask, views, render_template, request
app = Flask(__name__)
def login_required(func): # 装饰器
def wrapper(*args, **kwargs):
username = request.args.get('username')
if username:
return func(username, *args, **kwargs) # 注意这里要返回被装饰的类函数,同时传递用户名
else:
return render_template('login.html')
return wrapper # 返回内部函数
class ProfileView(views.View):
decorators = [login_required] # 使用装饰器
def dispatch_request(self, username):
return render_template('profile.html', username=username)
app.add_url_rule('/profile/', view_func=ProfileView.as_view('profileview')) # 注册
if __name__ == '__main__':
app.run(debug=True)
profile.html文件代码如下,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>个人中心</title>
</head>
<body>
<h3>{{ username }},欢迎进入个人中心</h3>
</body>
</html>
原文链接:https://blog.csdn.net/ForsetiRe/article/details/105542423/