Closed jamain closed 8 years ago
熟悉tornado就可以,因为大量借鉴了django,所以,如果之前有django经验,那么会更容易使用。
文档还在整理,有什么不明白的可以邮件我,我会给你详细解释。
请问下这个拦截器该怎么实现啊? 能不能提供个完整点的例子?
哈哈,你说的拦截器是?中间件?还是httpmodule?
就类似登陆跳转这种东西。一般都是用装饰器实现的
tornado默认是通过authenticated装饰器来判断current_user对象是否为空,你可以写一个httpmodule来代替这个装饰器的工作:
import urlparse
from urllib import urlencode
from torngas.httpmodule import BaseHttpModule
class CheckLogin(BaseHttpModule):
def begin_request(self, handler, clear):
#把authenticated那一套实现到这,或者按需自己实现~~
if not handler.current_user:
url = handler.get_login_url()
if "?" not in url:
if urlparse.urlsplit(url).scheme:
next_url = handler.request.full_url()
else:
next_url = handler.request.uri
url += "?" + urlencode(dict(next=next_url))
handler.redirect(url)
# 返回True来跳过handler,直接进入finish流程
return True
在settings里配置一下,假如你的路由名称是 ’add_blog':
ROUTE_MODULES = {
'’add_blog': ['your_modules.CheckLogin'],
}
这样请求这个路由的时候就会自动去跳转登录页,啥时候想增加或想删除登陆模块,只需要增删配置就行。如果需要登录的页面路由有规则,ROUTE_MODULES字典的key可以配成正则表达式。
非常详细,我研究下,多谢~
有个问题请教下,我在mysql client里面改了数据,程序查到的数据还是旧的,重启之后才能查到新数据。我看到SQLAlchemy的sessionmaker是设置了autoflush=kwargs.pop('autoflush', True),不应该有这个问题啊,请问这个是哪里有做缓存呢?
sqlalchemy需要在提交数据后需要调用session.remove,相当于提交事务同时刷新session,不然你的数据老是旧的,你需要引用sqlalchemy的中间件,torngas.middleware.dbalchemy.DBAlchemyMiddleware
,这个中间件会在你每次请求结束后自动remove掉sesssion。或者是你手动remove。
那如果是我在B程序里面修改了数据,是不是我每次在A程序select前都需要session.remove?
不需要,sqlalchemy要求在修改数据后尽量remove,或者你可以看下flask-sqlalchemy的文档,其实大同小异。在当前应用里,没有remove的话,事务没有真正提交,数据没有真正的落地,所以你拿不到最新结果。你在其他程序的修改也取决于修改的内容有没有真正入库并提交事务,只要数据真正在db落地了,你在任何地方都可以读到。
我测试的情况是,我先在A程序里查一次数据,然后在B程序(navicat)里修改了数据,然后在mysql client里面能查到新的数据,但是在A程序(torngas app)里查到的是旧的,如果我把A程序重启就能查到新数据了。后面我改了代码,在A程序每次查询前,主动调用下session.commit(),发现这样就不需要重启A就可以查到新数据了。我用的sqlalchemy是0.98版,我看doc里面 没有关于autoflush的说明了,是不是sessionmake时候的autoflush不起作用了。。。
没有遇到过这样的现象,可能是哪个参数配置不正确,我们都是在请求结束后调用remove回收session,修改数据只commit即可。即便直接改库也能实时反应数据变化的,你多研究下sqlalchemy的文档吧。
是不是要先熟悉下tornado 和 django才能用?