真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

自定義session-創(chuàng)新互聯(lián)

自定義Session

創(chuàng)新互聯(lián)建站長(zhǎng)期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為洪湖企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,洪湖網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

a.知識(shí)儲(chǔ)備

        #!/usr/bin/env python

        # -*- coding:utf-8 -*-

        class Foo(object):

           def __getitem__(self, key):

                 print '__getitem__',key

           def __setitem__(self, key, value):

                 print '__setitem__',key,value

           def __delitem__(self, key):

                 print '__delitem__',key

        obj = Foo()

        result = obj['k1'] 會(huì)執(zhí)行Foo類的 __getitem__方法

        obj['k2'] = 'wupeiqi' 會(huì)執(zhí)行Foo類的 __setitem__方法

        del obj['k1']    會(huì)執(zhí)行Foo類的 __delitem__方法

        類常用的內(nèi)置方法

        __init__(self,......):初始化對(duì)象,在創(chuàng)建新對(duì)象前申明

        __del__(self):釋放對(duì)象,在對(duì)象被刪除之前調(diào)用

        __new__(self,*args,**ked):實(shí)例的生產(chǎn)操作

        __str__(self):在使用print語(yǔ)句時(shí)調(diào)用

        __delitem__(self,key):為字典中刪除key對(duì)應(yīng)的元素

        __setitem__(self,key,value):為字典中的key賦值

        __getitem__(self,key):獲取序列的索引key對(duì)應(yīng)的值,等價(jià)于seq[key]

        __len__(self):在調(diào)用內(nèi)聯(lián)函數(shù)len()時(shí)被調(diào)用

        __cmp__(src,dst):比較兩個(gè)對(duì)象src和dst

        __getattr__(s,name):獲取屬性的值

        __setattr__(s,name):設(shè)置屬性的值

        __gt__(self,other):判斷self對(duì)象是否大于other對(duì)象

        __lt__(self,other):判斷self對(duì)象是否小于other對(duì)象

        __ge__(self,other):判斷self對(duì)象是否不大于other對(duì)象

        __le__(self,other):判斷self對(duì)象是否不小于other對(duì)象

        __eq__(self,other):判斷self對(duì)象是否等于other對(duì)象

        __call__(self,*args):把實(shí)例對(duì)象作為函數(shù)調(diào)用

        __new__():

   __new__()在__init__()之前被調(diào)用,用于生成實(shí)例對(duì)象.利用這個(gè)方法和類屬性的特性可以實(shí)現(xiàn)設(shè)計(jì)模式中的單例模式.單例模式是指創(chuàng)建唯一對(duì)象,單例模式設(shè)計(jì)的類只能實(shí)例化一個(gè)對(duì)象.

   #!/usr/bin/python

   # -*- coding: UTF-8 -*-

   class Singleton(object):

       __instance = None                      # 定義實(shí)例

       def __init__(self):

           pass

       def __new__(cls, *args, **kwd):        # 在__init__之前調(diào)用

           if Singleton.__instance is None:   # 生成唯一實(shí)例

               Singleton.__instance = object.__new__(cls, *args, **kwd)

           return Singleton.__instance

        __getattr__()、__setattr__()和__getattribute__():

   當(dāng)讀取對(duì)象的某個(gè)屬性時(shí),python會(huì)自動(dòng)調(diào)用__getattr__()方法.例如,fruit.color將轉(zhuǎn)換為fruit.__getattr__(color).當(dāng)使用賦值語(yǔ)句對(duì)屬性進(jìn)行設(shè)置時(shí),python會(huì)自動(dòng)調(diào)用__setattr__()方法.__getattribute__()的功能與__getattr__()類似,用于獲取屬性的值.但是__getattribute__()能提供更好的控制,代碼更健壯.注意,python中并不存在__setattribute__()方法.

   代碼例子:

   #!/usr/bin/python

   # -*- coding: UTF-8 -*-

   class Fruit(object):

       def __init__(self, color = "red", price = 0):

           self.__color = color

           self.__price = price

       def __getattribute__(self, name):              # 獲取屬性的方法

           return object.__getattribute__(self, name)

       def __setattr__(self, name, value):

           self.__dict__[name] = value

   if __name__ == "__main__":

       fruit = Fruit("blue", 10)

       print fruit.__dict__.get("_Fruit__color")      # 獲取color屬性

       fruit.__dict__["_Fruit__price"] = 5

       print fruit.__dict__.get("_Fruit__price")      # 獲取price屬性

           __getitem__()、__setitem__()、__delitem_():

       如果類把某個(gè)屬性定義為序列(列表、字典等),可以使用__getitem__()輸出序列屬性中的某個(gè)元素.假設(shè)水果店中銷售多鐘水果,可以通過(guò)__getitem__()方法獲取水果店中的每種水果,__setitem__()來(lái)設(shè)置,

       代碼例子,:

       #!/usr/bin/python

       # -*- coding: UTF-8 -*-

       class FruitShop:

        def __getitem__(self, i):     # 獲取水果店的水果

            print '__getitem__'

            return self.fruits[i]

        def __setitem__(self,key,value):

            self.fruits[key] = value

            print '__setitem__'

   if __name__ == "__main__":

       shop = FruitShop()

       shop.fruits = {}

       shop['apple'] = 'red' #["apple", "banana"]

       print shop['apple']

       輸出為:

       __setitem__

       __getitem__

       red

        __str__():

   __str__()用于表示對(duì)象代表的含義,返回一個(gè)字符串.實(shí)現(xiàn)了__str__()方法后,可以直接使用print語(yǔ)句輸出對(duì)象,也可以通過(guò)函數(shù)str()觸發(fā)__str__()的執(zhí)行.這樣就把對(duì)象和字符串關(guān)聯(lián)起來(lái),便于某些程序的實(shí)現(xiàn),可以用這個(gè)字符串來(lái)表示某個(gè)類

   代碼例子:

   #!/usr/bin/python

   # -*- coding: UTF-8 -*-

   class Fruit:

       '''Fruit類'''              #為Fruit類定義了文檔字符串

       def __str__(self):         # 定義對(duì)象的字符串表示

           return self.__doc__

   if __name__ == "__main__":

       fruit = Fruit()

       print str(fruit)           # 調(diào)用內(nèi)置函數(shù)str()出發(fā)__str__()方法,輸出結(jié)果為:Fruit類

       print fruit                #直接輸出對(duì)象fruit,返回__str__()方法的值,輸出結(jié)果為:Fruit類

   __call__():

   在類中實(shí)現(xiàn)__call__()方法,可以在對(duì)象創(chuàng)建時(shí)直接返回__call__()的內(nèi)容.使用該方法可以模擬靜態(tài)方法

   代碼例子:

   #!/usr/bin/python

   # -*- coding: UTF-8 -*-

   class Fruit:

       class Growth:       # 內(nèi)部類

           def __call__(self):

               print "grow ..."

       grow = Growth()     # 調(diào)用Growth(),此時(shí)將類Growth作為函數(shù)返回,即為外部類Fruit定義方法grow(),grow()將執(zhí)行__call__()內(nèi)的代碼

   if __name__ == '__main__':

       fruit = Fruit()

       fruit.grow()        # 輸出結(jié)果:grow ...

       Fruit.grow()        # 輸出結(jié)果:grow ...

b.session實(shí)現(xiàn)機(jī)制

   #!/usr/bin/env python

   # -*- coding:utf-8 -*-

   import tornado.ioloop

   import tornado.web

   from hashlib import sha1

   import os, time

   session_container = {}

   create_session_id = lambda: sha1('%s%s' % (os.urandom(16), time.time())).hexdigest()  #創(chuàng)建一個(gè)函數(shù),生成session_id

       #os.urandom(n) 返回n個(gè)隨機(jī)byte值的string,作為加密使用

   class Session(object):

       session_id = "__sessionId__"

       def __init__(self, request):

           session_value = request.get_cookie(Session.session_id) #從客戶端傳過(guò)來(lái)的cookie中取session_id值

           if not session_value:  #如果沒(méi)有,就生成一個(gè),賦給self._id

               self._id = create_session_id()

           else:

               self._id = session_value #如果有,就取出來(lái)賦給self._id

           request.set_cookie(Session.session_id, self._id) #設(shè)置cookie

       def __getitem__(self, key):  #取session[key]時(shí)返回 session_container[self._id][key]

           return session_container[self._id][key]

       def __setitem__(self, key, value): #設(shè)置session[key],就是設(shè)置 session_container[self._id]的key值等于value

           if session_container.has_key(self._id): #如果self._id已經(jīng)在sessiion_container里,就直接設(shè)置

               session_container[self._id][key] = value

           else:                  #如果不在,就創(chuàng)建字典并賦值

               session_container[self._id] = {key: value}

       def __delitem__(self, key):    #刪除session[key]時(shí),刪掉session_container[self._id][key]

           del session_container[self._id][key]

   class BaseHandler(tornado.web.RequestHandler):

       def initialize(self):

           # my_session['k1']訪問(wèn) __getitem__ 方法

           self.my_session = Session(self)  #創(chuàng)建類Session的對(duì)象my_session  

   class MainHandler(BaseHandler):

       def get(self):

           print self.my_session['c_user'] #返回 session_container[session_id]['c_user']的值

           print self.my_session['c_card'] #返回 session_container[session_id]['c_card']的值

           self.write('index')

   class LoginHandler(BaseHandler):

       def get(self):

           self.render('login.html', **{'status': ''})  #打開登錄頁(yè)面,返回的status為空

       def post(self, *args, **kwargs):

           username = self.get_argument('name')  

           password = self.get_argument('pwd')

           if username == 'wupeiqi' and password == '123': #判斷提交的用戶名和密碼,如果正確

               self.my_session['c_user'] = 'wupeiqi' #設(shè)置session_container[session_id]['c_user']='wupeiqi'

               self.my_session['c_card'] = '12312312309823012' #設(shè)置session_container[session_id]['c_card']='12312312309823012'

               self.redirect('/index') #重定向到 mainhandler

           else:

               self.render('login.html', **{'status': '用戶名或密碼錯(cuò)誤'}) #如果用戶名密碼不匹配,返回用戶名或密碼錯(cuò)誤

   settings = {  #配置信息

       'template_path': 'template',     #模板路徑

       'static_path': 'static',       #靜態(tài)文件路徑

       'static_url_prefix': '/static/',     #靜態(tài)文件路徑別名

       'cookie_secret': 'aiuasdhflashjdfoiuashdfiuh',   #設(shè)置cookie的加密碼

       'login_url': '/login'  

   }

   application = tornado.web.Application([  #路由規(guī)則

       (r"/index", MainHandler), 

       (r"/login", LoginHandler),

   ], **settings)

   if __name__ == "__main__":   

       application.listen(8888)     #監(jiān)聽8888端口

       tornado.ioloop.IOLoop.instance().start()  #啟動(dòng)服務(wù)

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


標(biāo)題名稱:自定義session-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://weahome.cn/article/dcdoep.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部