一、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.创建的时候有两种方式