10種Java開辟者編寫SQL語句經常見毛病。本站提示廣大學習愛好者:(10種Java開辟者編寫SQL語句經常見毛病)文章只能為提供參考,不一定能成為您想要的結果。以下是10種Java開辟者編寫SQL語句經常見毛病正文
起首來剖析下需求,web法式後台須要認證,後台頁面包括多個頁面,最通俗的辦法就是為每一個url添加認證,然則如許就須要每一個每一個綁定url的後台函數都須要添加相似或許雷同的代碼,然則如許做代碼就過度冗余,並且晦氣於擴大.
接上去我們先不談及裝潢器,我們都曉得Python是個很壯大的說話,她可以將函數當作參數傳遞給函數,最簡略的:
def p(): print 'Hello,world' def funcfactor(func): print 'calling function named', func.__name__ func() print 'end' funcfactor(p) # 輸入為: # calling function named p # Hello,world # end
了如指掌的法式,界說一個函數p(),將函數p當作參數傳遞給喊出funcfactor,在履行p函數前後加上一些舉措.
我們還可以這麼做:
def p(): print 'Hello,world' def funcfactor(func): print 'calling function named', func.__name__ return func func = funcfactor(p) func() # 輸入為: # calling function named p Hello,world
正如你看到的,我們可以將函數前往然後付與一個變量,留待稍後挪用.然則這類情形下我們要想在函數履行後做點甚麼就弗成能,然則我們的Python是壯大的,Python可以在函數中再嵌套一個函數,我們可以像上面這麼做:
def p(): print 'Hello, world' def funcfactor(func): def wrapper(): print 'do something at start' func() print 'do something at end' return wrapper func = funcfactor(p) func() #輸入為: # do something at start # Hello, world # do something at end
上面我們來看看裝潢器,下面的代碼固然完成的一個很艱苦的義務,然則還不敷優雅,並且代碼不相符Python的哲學思惟,所以裝潢器就回聲而出,裝潢器沒有和下面的道理雷同,異樣用於包裝函數,只是代碼完成上加倍優雅和便於浏覽.裝潢器以@開首前面跟上裝潢器的稱號,緊接著下一行就是要包裝的函數體,下面的例子用裝潢器可用以下方法完成:
def decorator(func): def wrapper(): print 'do something at start' func() print 'do something at end' return wrapper @decorator def p(): print 'Hello, world' p() #輸入為: # do something at start # Hello, world # do something at end
現實上裝潢器並沒有機能方面或其他方面的晉升,僅僅是一種語法糖,就是下面一個例子的改寫,如許加倍優雅和便與浏覽. 假如我們的p()函數不想僅僅只輸Hello,world,我們想向某些我們指定的人打召喚:
def decorator(func): def wrapper(*args, **kargs): print 'do something at start' func(**kargs) print 'do something at end' return wrapper @decorator def p(name): print 'Hello', name p(name="Jim") #輸入為: # do something at start # Hello Jim # do something at end
裝潢器在裝潢不須要參數的裝潢器嵌套函數不是必需得,假如被裝潢的函數須要參數,必需嵌套一個函數來處置參數. 寫到這裡想必年夜家也曉得裝潢器的用法和感化.如今回到正題,若何優雅的給後台url加上驗證功效?毫無疑問我們應用裝潢器來處置:
def blog_auth(func): ''' 界說一個裝潢器用於裝潢須要驗證的頁面 裝潢器必需放在route裝潢器上面 ''' # 界說包裝函數 def wrapper(*args, **kargs): try: # 讀取cookie user = request.COOKIES['user'] shell = request.COOKIES['shell'] except: # 湧現異常則重定向到登錄頁面 redirect('/login') # 驗證用戶數據 if checkShell(user, shell): # 校驗勝利則前往函數 return func(**kargs) else: # 不然則重定向到登錄頁面 redirect('/login') return wrapper
可以再須要驗證的處所添加blog_auth裝潢器:
@route('/admin:#/?#') @blog_auth def admin(): ''' 用於顯示後台治理首頁 ''' TEMPLATE['title'] = '儀表盤 | ' + TEMPLATE['BLOG_NAME'] TEMPLATE['user'] = request.COOKIES['user'] articles = [] for article in db.posts.find().sort("date",DESCENDING).limit(10): articles.append(article) # 將文章列表交給前台模版 TEMPLATE['articles'] = articles return template('admin.html',TEMPLATE)
至此bottle驗證的成績就很優雅的用裝潢器處理了.