资讯专栏INFORMATION COLUMN

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

syoya / 353人阅读

摘要:回顾通过前几篇文章的内容我们已经搭建了基于框架的一个简单的应用的代码如下抽象出类由于我们在以后的每个页面的中都要用到以及其他一些共用的特性我们将其提取出来抽象成一个类修改如下提取其他共用特性一般出现在请求中比如搜索时地址栏出现的

回顾

通过前几篇文章的内容, 我们已经搭建了基于 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, content):
        resp = make_response(content)
        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 Flask, make_response, request
from datetime import datetime, date

class Page(MethodView):
    def render(self, content):
        resp = make_response(content)
        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

参考资料

http://flask.pocoo.org/docs/1...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43195.html

相关文章

  • CSS学习笔记(十六) CSS最佳实践之可维护性篇

    摘要:国内各大公司都已经投入使用,在一些常见的网站,如淘宝腾讯小米等移动站点,随处可见其踪影。变革之腾讯手机淘宝的设计与实现前端乱炖适配总结样式重置上文已提及,这里推荐阅读同学写的专题文章。 前言 CSS代码难维护众所皆知。 为一个元素设置样式的方式可以通过定义的class、定义的id、元素的标签名、元素的属性等选择器以及这些选择器的组合来实现; 作用于某个元素上的样式又可能来自单个样式规...

    newtrek 评论0 收藏0
  • CSS学习笔记(十六) CSS最佳实践之可维护性篇

    摘要:国内各大公司都已经投入使用,在一些常见的网站,如淘宝腾讯小米等移动站点,随处可见其踪影。变革之腾讯手机淘宝的设计与实现前端乱炖适配总结样式重置上文已提及,这里推荐阅读同学写的专题文章。 前言 CSS代码难维护众所皆知。 为一个元素设置样式的方式可以通过定义的class、定义的id、元素的标签名、元素的属性等选择器以及这些选择器的组合来实现; 作用于某个元素上的样式又可能来自单个样式规...

    keke 评论0 收藏0

发表评论

0条评论

syoya

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<