Flask 中的MTV架构之Views

Flask 中的MTV架构之Views

1、MVC与MTV
1.1 MVC

​ M:model,模型,数据模型

​ V:view,视图,负责数据展示

​ C:controller,控制器,负责业务逻辑的处理

1.2 MTV

​ M:model,模型,就是数据模型

​ T:templates,模板,负责数据展示

​ V:view function,视图函数,负责业务逻辑的处理

2、Views(请求与响应)
2.1 内置对象

​ 1、app
获得应用对象:app = Flask(name)
配置应用参数:app.config[‘UPLOAD_FOLDER’] = os.getcwd()
从配置类中加载配置:app.config.from_object(configClass)
通用配置类实例

# 通用配置 
class Config: 
    # 秘钥 
    SECRET_KEY = os.environ.get('SECRET_KEY') or '123456' 

    # 数据库操作 
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True 
    SQLALCHEMY_TRACK_MODIFICATIONS = False 

    # 邮件发送 
    MAIL_SERVER = os.environ.get('MAIL_SERVER') or 'smtp.qq.com' 
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME') or 'xxx@qq.com' 
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') or '123456' 

    # bootstrap使用本地库 
    BOOTSTRAP_SERVE_LOCAL = True 

    # 上传文件 
    MAX_CONTENT_LENGTH = 8 * 1024 * 1024 
    UPLOADED_PHOTOS_DEST = os.path.join(base_dir, 'static/upload') 

    # 初始化函数,完成特定环境的初始化 
    @staticmethod 
    def init_app(app): 
        pass

​ 获得应用上下文:app.app_context()
蓝图:app.register_blueprint(blueprint, url_prefix=url_prefix)
2、current_app
获得当前app实例:app = current_app._get_current_object()
获得app配置的值:current_app.config[‘SECRET_KEY’]
3、 g

​ 全局变量存储器

 # g对象是全局变量储存容器,其中可以随意存储任何变量,
 #作用域覆盖所有的py文件和模板文件
    g.name = '哈士奇'

​ 在Templates模板里就可以直接使用g.name

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</ttle>
</head>
<body>

{# g对象是全局变量储存容器,其中可以随意存储任何变量,
作用域覆盖所有的py文件和模板文件#}
<h1>Hello {{ g.name }}!</h1>
</body>
</html>

​ 4、request

​ 请求对象,保存了客户端所有的HTTP的请求信息

​ 请求中的信息

   @app.route('/request/') 
   def req(): 
       # 完整的请求URL 
       # return request.url 

       # 基本路由地址,不包括get参数 
       # return request.base_url 

       # 只有主机和端口号 
       # return request.host_url 

       # 只包含装饰器中的路由地址 
       # return request.path 

       # 请求方法类型 
       # return request.method 

       # 客户端的IP 
       # return request.remote_addr 

       # 获取GET参数 
       # return request.args['name'] 
 
       # 获取请求头信息 
       return request.headers['User-Agent']

​ 其它
获得上传的文件:file = request.files.get(‘photo’)
获得GET请求参数:page = request.args.get(‘page’, 1, type=int)
5、session

​ 用户会话,用于保存需要’记住’的会话信息

​ 服务端存储技术

​ 设置秘钥

方法1(容易暴露密码):
设置秘钥,用于加密解密的字符串,不只是用于session
app.config['SECRET_KEY'] = '123456'

方法2(使用环境变量设置):
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or '123456'

​ 设置session

    @app.route('/set_session/') 
    def set_session(): 
        session['user'] = 'xiaoqiao' 
        return 'session已设置'

​ 获取session

@app.route('/get_session/') 
    def get_session(): 
        return session.get('user', None)
2.2 钩子函数

​ 第一次请求之前 :before_first_request
每次请求之前 :before_request
每次请求之后,前提是没有异常 :after_request
每次请求之后,即使有异常发生 :teardown_request
实例

@app.before_first_request 
def beforeFirstRequest():     
	print('beforeFirstRequest')
@app.before_request 
def beforeRequest():    
	print('beforeRequest', request)   
@app.after_request 
def afterRequest(resp):
	print('afterRequest', resp)     
	return resp   
@app.teardown_request 
def tearDownRequest(resp):     
	print('tearDownRequest', resp)     
	return resp
2.3带参路由

​ 带参路由

@app.route('/welcome/<name>') 
   def welcome(name): 
       return 'Hello %s !' % name

​ 指定参数类型(默认string)

@app.route('/user/<int:uid>')
   def show(uid):
       return '%d 号,你好!' % uid

​ path类型(参数中的/不再作为分隔符)

@app.route('/path/<path:p>')
   def path(p):
       return p
1.路由末尾的'/'建议都加上,因为需要的时候浏览器会自动加上,
输入时加不加都行
2.若需要制定参数,将参数写在<>中,视图函数参数要与路由参数一致
3.若需要知道参数类型,如:int/float/path等,写在参数前,
用':'与参数隔开
4.不指定类型,参数默认是string,path其实也是字符串,只是'/'不再是分隔符
2.4 请求与响应

​ request
请求对象,保存了客户端所有的HTTP的请求信息

​ 请求中的信息

   @app.route('/request/') 
   def req(): 
       # 完整的请求URL 
       # return request.url 

       # 基本路由地址,不包括get参数 
       # return request.base_url 

       # 只有主机和端口号 
       # return request.host_url 

       # 只包含装饰器中的路由地址 
       # return request.path 

       # 请求方法类型 
       # return request.method 

       # 客户端的IP 
       # return request.remote_addr 

       # 获取GET参数 
       # return request.args['name'] 
 
       # 获取请求头信息 
       return request.headers['User-Agent']

​ 其它
获得上传的文件:file = request.files.get(‘photo’)
获得GET请求参数:page = request.args.get(‘page’, 1, type=int)
response
服务器给客户端的响应

   @app.route('/response/') 
   def response(): 
       # 默认状态码200 
       # return 'OK' 

       # 在响应的后面指定状态码 
       # return 'Page not found', 404 

       # 先构造一个响应(也可以指定状态码),然后返回 
       resp = make_response('这是通过函数构造的响应', 404) 

       return resp
2.5重定向
  @app.route('/redirect/') 
  def old(): 
      # return '旧的内容' 
      # 重定向,响应指定一个路由地址 
      #return redirect('/new/') 
      # 根据视图函数,反向的构造出来路由地址,传递的参数是视图函数名 
      # return url_for('req') 
      # 构造带参数的路由,直接写在后面即可 
      # return url_for('welcome', name='xiaoming') 
      return redirect(url_for('new')) 

  @app.route('/new/') 
  def new(): 
      return '新的内容'
2.6 终止和处理错误

​ 抛出错误并终止

    @app.route('/abort/')
    def err():
        abort(404)
        return 'abort测试'

​ 处理错误

@app.errorhandler(404) 
def page_not_found(e): 
    # 渲染指定模板 
    return render_template('errors/404.html')
2.7 会话控制

​ cookie

​ 客户端存储技术

​ 设置cookie

    @app.route('/set_cookie/') 
    def set_cookie(): 
        resp = make_response('cookie已设置') 
        expires = time.time() + 10 
 
        # 设置cookie,可以指定过期时间
        resp.set_cookie('name', 'xiaoming', expires=expires) 
        return resp

​ 获取cookie

    @app.route('/get_cookie/') 
    def get_cookie(): 
        return request.cookies.get('name') or None
2.8 session

​ 设置秘钥

#方法1(容易暴露密码):
#设置秘钥,用于加密解密的字符串,不只是用于session
app.config['SECRET_KEY'] = '123456'

方法2(使用环境变量设置):
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or '123456'

​ 设置session

    @app.route('/set_session/') 
    def set_session(): 
        session['user'] = 'xiaoqiao' 
        return 'session已设置'

​ 获取session

@app.route('/get_session/') 
    def get_session(): 
        return session.get('user', None)
2.9 blueprint

a.什么是蓝图?

一个蓝图定义了可用于单个应用的视图,模板,静态文件等等的集合。

b.什么时候会用到蓝图?

使用蓝图的好处是将你的应用组织成不同的组件,比如把admin,user相关的视图方法分为两个组件,一个是admin组件,一个是user组件.这时我们可以创建两个蓝图实现这两个独立的组件。

c.定义蓝图

   from flask import Blueprint

   # 创建蓝图对象
   user = Blueprint('user', __name__)

   # 添加路由(视图函数)
   @user.route('/login/')
   def login():
       return '欢迎登录'

   @user.route('/register/')
   def register():
       return '欢迎注册'

​ d.注册蓝图

   # 在使用的地方进行注册
   # 注册蓝图,未注册的蓝图处于休眠状态(无法使用),
   #可以通过url_prefix指定前缀,
   #当request.url是以/user开头的情况下才会
   #通过注册的蓝图的视图方法处理请求并返回
   from user import user
   app.register_blueprint(user, url_prefix='/user')

【后记】:如果文章对您有帮助,打赏下呗。微信 1257309054,欢迎交流学习*_*
微信
在这里插入图片描述
支付宝
在这里插入图片描述

posted @ 2018-06-29 10:37  轻松学编程  阅读(551)  评论(0编辑  收藏  举报