Web 开发学习笔记(5) --- 抽象出 Page 类

栏目: Python · 发布时间: 7年前

回顾

  • 通过前几篇文章的内容, 我们已经搭建了基于 Flask 框架的一个简单的 Web 应用, server.py 的代码如下

    from flask import Flask, make_response
    from flask.views import MethodView
    app = Flask(__name__)
    
    class IndexHandler(MethodView):
        def get(self):
            resp = make_response('It is a GET request')
            resp.headers['Strict-Transport-Security'] = 'max-age=15768000; includeSubDomains; preload'
            return resp
    
    if __name__ == '__main__':
        app.add_url_rule('/', view_func=IndexHandler.as_view('index'))
        context = ('./server.cer', './server.key')
        app.run(port=443, host='0.0.0.0', debug=True, threaded=True, ssl_context=context)

抽象出 Page

  • 由于我们在以后的每个页面的 Handler 中都要用到 HSTS , 以及其他一些共用的特性, 我们将其提取出来, 抽象成一个 Page 类, 修改 server.py 如下

    from flask import Flask, make_response
    from flask.views import MethodView
    app = Flask(__name__)
    
    class Page(MethodView):
        def render(self, resp):
            resp.headers['Strict-Transport-Security'] = 'max-age=15768000; includeSubDomains; preload'
            return resp
    
    class IndexHandler(Page):
        def get(self):
            content = 'It is a GET request'
            return self.render(content)
    
    if __name__ == '__main__':
        app.add_url_rule('/', view_func=IndexHandler.as_view('index'))
        context = ('./server.cer', './server.key')
        app.run(port=443, host='0.0.0.0', debug=True, threaded=True, ssl_context=context)

提取其他共用特性

  • get_args()

    args 一般出现在 GET 请求中, 比如 Google 搜索时地址栏出现的 https://www.google.com/search?q=awesome , 其中 ? 后面的内容就是 args , 以 key-value 的形式出现. 对应刚才的例子, key 就是 q , value 就是 awesome . 如果有多组 key-value , 中间就用 & 连接, 如 ?q=awesome&type=server . 这种形式很容易让我们联想到 Python 的字典结构 dict . 根据 文档 , Flask 是通过 ImmutableMultiDict 来存储 args 的. 我们可以在 Page 类中增加 get_args() 方法

    from flask import request
    class Page(MethodView):
        def get_args(self, key):
            return request.args.get(key)

    这样, 我们就可以通过调用 get_args() 来获取用户请求中的参数了, 举个栗子

    class AwesomeHandler(Page):
        def get(self):
            if self.get_args('q') == 'awesome':
                # do something
                return 'This is an awesome page!'
  • 同样地, 我们可以在 Page 类中增加其他特性, 如 get_date() , get_referer() , get_cookies() 等等, 编写好的 Page 类如下

    from flask import request
    from datetime import datetime, date
    
    class Page(MethodView):
        def render(self, resp):
            resp.headers['Strict-Transport-Security'] = 'max-age=15768000; includeSubDomains; preload'
            return resp
    
        def get_args(self, key):
            return request.args.get(key)
    
        def get_date(self, year=0, month=0, day=0):
            if year and month and day:
                return date(year, month, day)
            else:
                return date.today()
    
        def get_referer(self):
            return request.headers.get('referer')
    
        def get_cookies(self):
            return request.cookies

参考资料


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python for Data Analysis

Python for Data Analysis

Wes McKinney / O'Reilly Media / 2012-11-1 / USD 39.99

Finding great data analysts is difficult. Despite the explosive growth of data in industries ranging from manufacturing and retail to high technology, finance, and healthcare, learning and accessing d......一起来看看 《Python for Data Analysis》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具