zoukankan      html  css  js  c++  java
  • 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/

    写入自己的博客中才能记得长久
  • 相关阅读:
    TCP链接异常断开后,对端仍然ESTABLISH
    mds0: Many clients (191) failing to respond to cache pressure
    Linux C/C++编译过程中的各种not declared in this scope
    Centos7添加磁盘并分区格式化
    Windows Terminal——安装并配置主题
    Kbone——创建项目报错 name can no longer contain capital letters
    Redis——大批量删除redis的key
    Redis——设置最大内存 | key淘汰机制
    Nightingale——滴滴夜莺部署【一】
    ELK——使用Docker快速搭建
  • 原文地址:https://www.cnblogs.com/heris/p/14650436.html
Copyright © 2011-2022 走看看