Flask转Django时flask.url_for、flask.request.url对应代码如何实现?
Flask与Django对应API转换说明
1. flask.url_for('oauth2callback', _external=True) 对应Django实现
flask.url_for 加 _external=True 参数的作用是生成带协议、域名端口的完整绝对回调地址,不要硬编码地址,避免部署时需要手动修改,Django对应写法如下:
首先要在你的urls.py中给回调路由配置name属性:
# urls.py 示例配置 urlpatterns = [ path('api/oauth2callback', 你的回调视图函数, name='oauth2callback'), ]
视图中生成完整回调地址的代码:
from django.urls import reverse # 等价于flask的url_for带_external=True flow.redirect_uri = request.build_absolute_uri(reverse('oauth2callback'))
2. flask.request.url 对应Django实现
flask.request.url的返回值是当前请求的完整绝对URL,包含协议、域名、路径、所有查询参数,比如Google OAuth跳转回的地址https://你的域名/api/oauth2callback?code=xxx&state=xxx会被完整返回。
Django中没有request.url属性,对应等价写法为:
# 等价于flask.request.url authorization_response = request.build_absolute_uri()
完整转换后的Django代码示例
# 你的回调视图代码 from django.urls import reverse from django.http import HttpResponseRedirect import google_auth_oauthlib.flow def oauth2callback(request): state = request.session['state'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'], state=state) flow.redirect_uri = request.build_absolute_uri(reverse('oauth2callback')) authorization_response = request.build_absolute_uri() flow.fetch_token(authorization_response=authorization_response) # 生产环境请将凭证存入用户数据库,不要存在session中 credentials = flow.credentials request.session['credentials'] = { 'token': credentials.token, 'refresh_token': credentials.refresh_token, 'token_uri': credentials.token_uri, 'client_id': credentials.client_id, 'client_secret': credentials.client_secret, 'scopes': credentials.scopes } # 授权完成后跳转至你的业务页面 return HttpResponseRedirect('/')
注意事项
- 本地调试使用http协议时,需要提前设置环境变量
OAUTHLIB_INSECURE_TRANSPORT=1,否则oauthlib会拦截非https请求抛出错误。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

