国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 利用Python的裝飾器解決Bottle框架中用戶驗證問題

利用Python的裝飾器解決Bottle框架中用戶驗證問題

2020-06-12 10:30C Wong Python

這篇文章主要介紹了Python的Bottle框架中解決用戶驗證問題,代碼基于Python2.x版本,需要的朋友可以參考下

首先來分析下需求,web程序后臺需要認證,后臺頁面包含多個頁面,最普通的方法就是為每個url添加認證,但是這樣就需要每個每個綁定url的后臺函數都需要添加類似或者相同的代碼,但是這樣做代碼就過度冗余,而且不利于擴展.

接下來我們先不談及裝飾器,我們都知道Python是個很強大的語言,她可以將函數當做參數傳遞給函數,最簡單的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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,在執(zhí)行p函數前后加上一些動作.

我們還可以這么做:

?
1
2
3
4
5
6
7
8
9
10
11
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

正如你看到的,我們可以將函數返回然后賦予一個變量,留待稍后調用.但是這種情況下我們要想在函數執(zhí)行后做點什么就不可能,但是我們的Python是強大的,Python可以在函數中再嵌套一個函數,我們可以像下面這么做:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

下面我們來看看裝飾器,上面的代碼雖然實現的一個很困難的任務,但是還不夠優(yōu)雅,而且代碼不符合Python的哲學思想,所以裝飾器就應聲而出,裝飾器沒有和上面的原理相同,同樣用于包裝函數,只是代碼實現上更加優(yōu)雅和便于閱讀.裝飾器以@開頭后面跟上裝飾器的名稱,緊接著下一行就是要包裝的函數體,上面的例子用裝飾器可用如下方式實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

實際上裝飾器并沒有性能方面或其他方面的提升,僅僅是一種語法糖,就是上面一個例子的改寫,這樣更加優(yōu)雅和便與閱讀. 如果我們的p()函數不想僅僅只輸Hello,world,我們想向某些我們指定的人打招呼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

裝飾器在裝飾不需要參數的裝飾器嵌套函數不是必須得,如果被裝飾的函數需要參數,必須嵌套一個函數來處理參數. 寫到這里想必大家也知道裝飾器的用法和作用.現在回到正題,如何優(yōu)雅的給后臺url加上驗證功能?毫無疑問我們使用裝飾器來處理:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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裝飾器:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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驗證的問題就很優(yōu)雅的用裝飾器解決了.

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久久久久久久久 | 欧美激情一区二区三区 | 日韩精品在线一区二区 | 亚洲一区二区三区免费观看 | 久久久一区二区三区 | 中文字幕精品一区二区精品绿巨人 | www.一区| 激情网婷婷| 亚洲国产精品成人 | 9色av| 成人av在线网 | 亚洲欧美视频网站 | 中文字幕在线观看一区二区三区 | 99爱精品在线 | 国产精品美女久久久久久久久久久 | av电影免费在线观看 | 久久在线视频 | 国产免费久久 | 亚洲高清电影 | 欧美日韩高清在线一区 | 在线国产一区 | 91精品国产综合久久小仙女陆萱萱 | 国产成人天天爽高清视频 | 日本视频中文字幕 | 日本一区二区免费视频 | 欧洲亚洲精品久久久久 | 91精品国产综合久久久久久 | h在线观看视频 | 一级黄片毛片免费看 | 国产区在线 | 黄色高清视频在线观看 | 欧美不卡在线 | 日韩福利 | 自拍视频网 | 欧美一级大片免费 | 欧美日韩一区二区电影 | 国内精品一区二区 | 精品欧美日韩 | 久久久久久网站 | 久久久久久亚洲精品视频 | 日韩精品一区二区三区四区 |