学习记录(8)

来源:互联网 发布:做网站必备软件 编辑:程序博客网 时间:2024/04/25 12:37

今日学习综述

  • 《图解http》第十章
  • flask项目实践3

遇见的问题及解决

在实践中遇到一些概念,不懂得的,简单地记一下。

应用全局变量

只在一个请求内,从一个函数到另一个函数共享数据,全局变量并不够好。因为这在线程环境下行不通。Flask提供了一个特殊的对象来确保只在活动中的请求有效,并且每个请求都返回不同的值。

flask.g
在这上存储你任何你想要存储的。例如一个数据库连接或者当前登入的用户。

从 Flask 0.10 起,对象 g 存储在应用上下文(?)中而不再是请求上下文中(?),这意味着即使在应用上下文中它也是可访问的而不是只能在请求上下文中。在结合 伪造资源和上下文 模式使用来测试时这尤为有用。

另外,在 0.10 中你可以使用 get() 方法来获取一个属性或者如果这个属性没设置的话将得到 None (或者第二个参数)。 这两种用法现在是没有区别的:

user = getattr(flask.g, 'user', None)user = flask.get.get('user', None)

现在也能在 g 对象上使用 in 运算符来确定它是否有某个属性,并且它将使用 yield 关键字来生成这样一个可迭代的包含所有keys的生成器。

上下文(context)

Flask从客户端接收请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象就是一个很好的例子,它封装了客户端发送HTTP请求。

要想让视图函数能够访问请求对象,可以将其作为参数传进视图函数。不过这会导致程序中的每个视图函数都要增加一个参数。除了访问请求对象,如果视图函数在请求时还要访问其他对象,情况会变得更糟糕。

为了避免大量可有可无的参数把视图函数弄得一团糟,Flask 使用上下文临时把某些对象变为全局可访问。有了上下文,就可以写出下面的视图函数:

from flask import request@app.route('/')def index():    user_agent = request.headers.get('User-Agent')    return '<p>Your browser is %s</p>' % user_agent

这个视图函数中我们把request当作全局变量使用。事实上,request不可能是全局变量。试想,在多线程服务器中,多个线程同时处理不同客户端发送的不用请求时,每个线程看到的request对象必然不同。Flask使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他进程。
F
lask有两种上下文:应用上下文( application context )和请求上下文(request context)。Flask在分发请求之前激活(或推送)应用和请求上下文,请求处理完成后再将其删除。应用上下文被推送后,就可以在线程中使用current_appg变量。类似地,请求上下文被推送后,就可以使用requestsession变量。

关于Flask中的before_request、after_request,teardown_request

before_request :在请求收到之前绑定一个函数做一些事情。
after_request:每一个请求之后绑定一个函数,如果请求没有异常。
teardown_request:每一次请求后绑定一个函数,即使遇到了异常。

execute()

将字符串内容当作命令来执行,即执行原生的SQL语句。

cur = g.db.execute('select title,text from entries order by id desc')
  • desc–降序(descend)
  • asc – 升序(ascend)

未解决的问题

在客户登录时,提交完之后会出现一个报错
这里写图片描述
试过换了一个浏览器,清除了浏览器的缓存之后还是没有。
明天再试试。

明日计划

  • 任务布置之数据库相关、前端相关
  • 《图解HTTP》十一
  • 继续调flask的一个小程序。
原创粉丝点击