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/

posted @ 2021-04-12 21:24  ty1539  阅读(471)  评论(0编辑  收藏  举报