Flask视图进阶

1、add_url_rule

这个方法用来添加url与视图函数的映射。如果没有填写`endpoint`,那么默认会使用`view_func`的名字作为`endpoint`。以后在使用`url_for`的时候,就要看在映射的时候有没有传递`endpoint`参数,如果传递了,那么就应该使用`endpoint`指定的字符串,如果没有传递,那么就应该使用`view_func`的名字。

def my_list():
    return '我是列表页'

app.add_url_rule('/list/',endpoint='test',view_func=my_list)
#endpoint 给url取个名字

@app.route('/',endpoint='index')
def hello_world():
    print(url_for('test')) #应使用endpoint的值,没有endpoint再使用view_func    
    return 'Hello World!'

2、类视图

和Django对比,这相当于Django中的CBV。

标准视图:

  • 必须继承自 flask.views.View
  • 必须实现dispatch_request方法,以后请求过来后,都会执行这个方法,返回值相当于视图函数一样,必须返回'Response'或者子类的对象,或者是字符串,或者是元祖
  • 必须通过app.add_url_role(url_rule,view_func)来做url与视图的映射
class Test(views.View):
    def __init__(self):
        self.context = {
            'name': 'tian',
            'age': 18,
            'hobby': '抽烟,喝酒,烫头'
        }

    def dispatch_request(self):
        return render_template('test.html', **self.context)


app.add_url_rule('/test/', view_func=Test.as_view('test'))

test.html

<h1>{{ name }}</h1>
<h1>{{ age }}</h1>
<h1>{{ hobby }}</h1>

基于调度方法的类视图:

根据请求的`method`来执行不同的方法的。如果用户是发送的`get`请求,那么将会执行这个类的`get`方法。如果用户发送的是`post`请求,那么将会执行这个类的`post`方法。

class LoginView(views.MethodView):
    def __render(self, error=None):
        return render_template('login.html', error=error)  # 传递错误信息error

    def get(self):
        return self.__render()

    def post(self):
        username = request.form.get('username')  # request.form
        password = request.form.get('password')
        if username == 'dage' and password == '666666':
            return '登录成功'
        else:
            return self.__render(error='用户名或密码错误')


app.add_url_rule('/login/', view_func=LoginView.as_view('login'))

3、蓝图

结构更加清晰,将相同模块的视图函数放在同一个蓝图下,同一个文件中,方便管理。

将大项目分开,像Django的多app。

以用户模块为例:

from flask import Blueprint

user_bp = Blueprint('user',__name__,url_prefix='/user') #名字,__name__,url_prefix给路径前面加个user前缀


@user_bp.route('/profile/')
def profile():
    return '个人中心页面'
然后在主app文件中注册:
app.register_blueprint(user_bp)

①模板文件的寻找

优先去项目下的template文件下寻找,如果找不到,则到定义蓝图时给出的路径去寻找

news_bp = Blueprint('user', __name__, url_prefix='/news', 
    template_folder='user_template')

②静态文件的查找

  • 在模版文件中,加载静态文件,如果使用url_for('static'),那么就只会在app指定的静态文件夹目录下查找静态文件。
  • 如果在加载静态文件的时候,指定的蓝图的名字,比如`news.static`,那么就会到这个蓝图指定的static_folder下查找静态文件。

4、url_for反转蓝图

在使用url_for找蓝图中函数的url时,应指定蓝图。同样在模板中使用时也应该指定蓝图的名字。

url_for('user.list')

5、蓝图实现子域名

蓝图可以配置自己的域名:

app.config['SERVER_NAME'] = 'baidu.com:5000'

①需要修改hosts文件,添加如下:

127.0.0.1   baidu.com

②设置子域名,关键参数:subdomain

cms_bp = Blueprint('cms', __name__, subdomain='wenku')

注意:IP地址不能有子域名。

          localhost也不能有子域名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值