Django集成Dropbox API OAuth2认证报错:缺少request参数
解决Dropbox OAuth2授权时
dropbox_auth_start() missing 1 required positional argument: 'request'错误 嘿,我来帮你搞定这个问题!你遇到的这个错误其实是Django视图函数的参数顺序搞反了,很容易犯的小问题,咱们一步步来修正:
错误原因
Django的视图函数有个硬性规则:第一个参数必须是request对象,它包含了当前HTTP请求的所有信息。但你现在把web_app_session放在了request前面,当Django路由到这个视图时,会自动把请求对象传给第一个参数(也就是你定义的web_app_session),导致真正需要的request参数没被传入,所以才会报“缺少request参数”的错误。
另外,你其实不需要把web_app_session作为视图参数传入——Django的会话对象已经存在于request.session里了,直接用它就行。
修正后的代码
views.py
from dropbox import DropboxOAuth2Flow from django.shortcuts import redirect def get_dropbox_auth_flow(web_app_session): redirect_uri = "https://www.my-dummy-url.com" APP_KEY = 'my-app-key' APP_SECRET = 'my-app-secret' return DropboxOAuth2Flow( APP_KEY, APP_SECRET, redirect_uri, web_app_session, "dropbox-auth-csrf-token") # 把request调整为第一个参数,移除多余的web_app_session参数 def dropbox_auth_start(request): if request.method == 'GET': # 传入Django自带的request.session给Dropbox的授权流程 authorize_url = get_dropbox_auth_flow(request.session).start() return redirect(authorize_url)
urls.py
你的urls配置不需要修改,保持原样即可:
urlpatterns = [ path('dropbox/', views.dropbox_auth_start, name='dropbox') ]
补充说明
这样调整后,Django就能正确传递request对象,同时request.session会帮你存储Dropbox OAuth流程需要的CSRF令牌,避免跨站请求伪造的风险。接下来你就可以继续完成授权回调的逻辑啦~
内容的提问来源于stack exchange,提问作者Hannan
相关产品推荐
相关产品推荐

