一、SESSIN 原理
首先客户端访问服务器时生成一个COOKIE,服务器上有一个专门保存客户端访问服务器时COOKIE的SESSION 字典, 当客户端去访问服务器时,发送COOKIE 请求 去服务器SESSION字典认证,如果字典里没有,则生成SESSION 字符串保存到SESSION 字典中,然后返回给客户端,保存到COOKIE里,下次再访问服务器时 拿着此字符串去服务器端认证。
代码如下
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
from hashlib import sha1
import os, time
session_container = {}#存session的字典
create_session_id = lambda: sha1(‘%s%s‘ % (os.urandom(16), time.time())).hexdigest()
class Session(object):
session_id = "session_cookie"#读取sessioncookie值
#如过存在session 就读取 如果不存在就创建
def __init__(self, request):
session_value = request.get_cookie(Session.session_id)
if not session_value:
# 创建随机字符串
self._id = create_session_id() #创建的session 封装到session id 里
else:
# 如果有,直接将客户端的随机字符串设置为 _id
self._id = session_value
request.set_cookie(Session.session_id, self._id)#设置cookie
def __getitem__(self, key):
ret = None
try:
ret = session_container[self._id][key]
except Exception,e:
pass
return ret
def __setitem__(self, key, value):
# self._id
if session_container.has_key(self._id):
session_container[self._id][key] = value
else:
# key = is_login
# value = true
# {}
# {
# 随机字符串:{‘is_login‘: "true"}
# }
session_container[self._id] = {key: value}
def __delitem__(self, key):
del session_container[self._id][key]
class BaseHandler(tornado.web.RequestHandler):#继承RequestHandler 类
def initialize(self):#当请求过来是先执行此方法 获取用户COOkie
# my_session[‘k1‘]访问 __getitem__ 方法
self.my_session = Session(self) #self:LoginHandler 对象
class MainHandler(BaseHandler):
def get(self):
ret = self.my_session[‘is_login‘]
if ret:
self.write(‘index‘)
else:
self.redirect("/login")
class LoginHandler(BaseHandler):#继承BaseHandler的类
def get(self):#其次执行GET 方法
# self.set_cookie()
# self.get_cookie()
# 写 :session_cookie = "最忌字符串"
self.render(‘login.html‘)
def post(self, *args, **kwargs): #定义POST方法
username = self.get_argument(‘username‘)#用户名
password = self.get_argument(‘pwd‘)#密码
if username == ‘wupeiqi‘ and password == ‘123‘: #如果用户名密码匹配
self.my_session["is_login"] = "true"#SESSION 为真
# self.my_session[‘c_user‘] # __getitem__
# self.my_session[‘c_user‘] = 123 # __setitem__
# del self.my_session[‘c_user‘] # __delitem__
#
# self.my_session[‘c_user‘] = ‘wupeiqi‘
# self.my_session[‘c_card‘] = ‘12312312309823012‘
self.redirect(‘/index‘) #返回INDEX 页面
else:
self.render(‘login.html‘, **{‘status‘: ‘用户名或密码错误‘}) #否则报用户名密码错误
settings = {
‘template_path‘: ‘template‘,
‘static_path‘: ‘template‘,
‘static_url_prefix‘: ‘/template/‘,
‘cookie_secret‘: ‘aiuasdhflashjdfoiuashdfiuh‘,
‘login_url‘: ‘/login‘
}
#创建APPLICATION 及创建两个路径对应相对的函数
application = tornado.web.Application([
(r"/index", MainHandler),# 执行MainHandler 函数
(r"/login", LoginHandler),# 执行LoginHandler 函数
], **settings)
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
二、Django ORM 关系
Django 的ORM 有多总关系: 一对一,多对一,多对多。
各自定义的方式为:
一对一: OneToOneField 即一个对应一个
一对多: ForeignKey 即多个对应一个
多对多: ManyToManyField即 多个对应多个
一对多
1.创建的时候有两种方式