request.build_absolute_uri()用法

request.build_absolute_uri() 是 Django 中一个非常实用的方法,用于构建完整的、绝对的 URL(包含协议、域名、端口和路径)


📌 基本语法

复制代码
request.build_absolute_uri(location=None)
  • 如果 不传参数:返回当前请求的完整绝对 URL。
  • 如果 传入 location(字符串) :将 location 拼接到当前站点的根地址上,生成完整 URL。

✅ 举个例子

假设你的网站部署在:

复制代码
https://example.com:8000/myapp/
情况 1:不传参数(获取当前页面完整 URL)
复制代码
# 用户访问 https://example.com:8000/student/123/
full_url = request.build_absolute_uri()
print(full_url)
# 输出: https://example.com:8000/student/123/
情况 2:传入相对路径(常用于生成二维码、分享链接等)
复制代码
relative_path = "/student-volunteer-er/6/"
full_url = request.build_absolute_uri(relative_path)
print(full_url)
# 输出: https://example.com:8000/student-volunteer-er/6/

💡 即使你本地开发用 http://127.0.0.1:8000,它也会自动适配为 http://127.0.0.1:8000/...

部署到线上后自动变成 https://yourdomain.com/...无需硬编码域名


🔧 常见用途

场景 说明
生成二维码 二维码必须是完整 URL,不能是 /path/
发送邮件中的链接 邮件里不能用相对路径,必须是 https://...
第三方回调地址 如微信登录、支付回调,需要提供完整 URL
SEO 或 Open Graph 标签 <meta property="og:url" content="完整URL">

⚠️ 注意事项

  1. 依赖 Host 请求头

    Django 通过 request.get_host() 获取域名,而 get_host() 来自 HTTP 请求头中的 Host 字段。

    → 所以在反向代理(如 Nginx)后面时,要确保正确传递 Host 头,或设置 USE_X_FORWARDED_HOST = True

  2. 不要手动拼接 http:// + domain + path

    这样容易出错(比如忘记端口、协议是 http/https 混乱)。

    ✅ 用 build_absolute_uri() 更安全、更通用。

  3. reverse() 配合使用

    复制代码
    from django.urls import reverse
    
    relative_url = reverse('student_volunteer_erlist', kwargs={'student_id': 6})
    absolute_url = request.build_absolute_uri(relative_url)
    # 结果: https://example.com/student-volunteer-er/6/

✅ 总结

方法 返回值
request.path /student/123/(仅路径)
request.get_full_path() /student/123/?a=1(路径+查询参数)
request.build_absolute_uri() https://example.com/student/123/(完整 URL)✅
相关推荐
tkevinjd1 小时前
MiniCode 项目详解6:原项目控制系统的10个缺陷(已修复)
python·llm·agent
dNGUZ7UGj2 小时前
10分钟完成第一个Python小游戏
python·django
没有梦想的咸鱼185-1037-16633 小时前
AI-Python机器学习与深度学习技术:CNN/Transformer/扩散模型、SHAP可解释及Hermes智能体自动化
人工智能·python·深度学习·机器学习·chatgpt·cnn·transformer
霸道流氓气质3 小时前
SpringBoot中通用工具类库(Utils)封装与使用实践
spring boot·后端·python
Draina5 小时前
CBC填充预言攻击-CBC Padding Oracle Crypto Attack
python·安全·web安全·网络安全·密码学·安全性测试
Angel Q.5 小时前
特征提取 | DINO 到 DINOv3
图像处理·python
不如语冰6 小时前
AI大模型入门-pytorch-张量2 tensor创建
python
NPE~6 小时前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发
矮个史蒂芬6 小时前
统计verilog .v文件中output 的bit数
python
gwf2166 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件