我在我的Django項目中創建了一個裝飾器,以將參數值插入裝飾方法的參數。在基於Django類的視圖中檢查視圖方法參數名稱
我通過使用inspect.getargspec
來檢查方法中存在哪些參數並將它們放置在kwargs
中。否則,由於方法中參數的數量不正確,我會得到一個錯誤。
雖然這在單獨的視圖方法中正常工作,但它涉及到Django的基於類的視圖時會失敗。
我相信這可能是因爲裝修使用@method_decorator
在類級別的dispatch
方法而不是個別get
和post
方法施用。
我是一個蟒蛇新手,可能會忽略這裏明顯的東西。
有沒有更好的方式來做我在做什麼?是否有可能在基於類的視圖中獲取方法參數名稱?
我使用Python 2.7和1.11的Django
的裝飾
def need_jwt_verification(decorated_function):
@wraps(decorated_function)
def decorator(*args, **kwargs):
request = args[0]
if not isinstance(request, HttpRequest):
raise RuntimeError(
"This decorator can only work with django view methods accepting a HTTPRequest as the first parameter")
if AUTHORIZATION_HEADER_NAME not in request.META:
return HttpResponse("Missing authentication header", status=401)
jwt_token = request.META[AUTHORIZATION_HEADER_NAME].replace(BEARER_METHOD_TEXT, "")
try:
decoded_payload = jwt_service.verify_token(jwt_token)
parameter_names = inspect.getargspec(decorated_function).args
if "phone_number" in parameter_names or "phone_number" in parameter_names:
kwargs["phone_number"] = decoded_payload["phone"]
if "user_id" in parameter_names:
kwargs["user_id"] = decoded_payload["user_id"]
if "email" in parameter_names:
kwargs["email"] = decoded_payload["email"]
return decorated_function(*args, **kwargs)
except JWTError as e:
return HttpResponse("Incorrect or expired authentication header", status=401)
return decorator
基於
類視圖
@method_decorator([csrf_exempt, need_jwt_verification], name="dispatch")
class EMController(View):
def get(self, request, phone_number, event_id):
data = get_data()
return JsonResponse(data, safe=False)
def post(self, request, phone_number, event_id):
return JsonResponse("Operation successful", safe=False)
編輯:
施加裝飾的明顯的解決方案在方法級別,不適用於Django的基於類的視圖。您需要在url配置中應用裝飾器或將裝飾器應用於調度方法。
編輯: 我已經發布了與我正在探索的解決方法相關的代碼,將參數名稱作爲參數傳遞給裝飾器。
發佈您正在面臨問題的代碼 – Exprator
我不認爲它會有太大用處。但確定... – Thihara
我試過你的代碼,它工作完美!那麼,你能給出一些細節嗎? – gushitong