request.build_absolute_uri()关于使用IP+端口

request.build_absolute_uri()自动根据用户实际访问的地址(包括 IP、端口、协议)生成正确的完整 URL


✅ 场景示例:用 IP + 端口访问

假设你的 Django 应用运行在内网服务器上,用户通过以下地址访问:

复制代码
http://192.168.3.57:8080/some-page/

此时你在视图中调用:

复制代码
relative_url = reverse('student_volunteer_erlist', kwargs={'student_id': 6})
absolute_url = request.build_absolute_uri(relative_url)

那么 absolute_url 的结果将是:

复制代码
http://192.168.3.57:8080/student-volunteer-er/6/

✅ 自动包含:

  • 协议:http(因为用户用 http 访问)
  • IP 地址:192.168.3.57
  • 端口::8080
  • 路径:/student-volunteer-er/6/

🔧 它是怎么知道 IP 和端口的?

Django 通过 HTTP 请求头中的 Host 字段 获取主机信息。

当你在浏览器访问:

复制代码
http://192.168.3.57:8080/xxx

浏览器会发送类似这样的请求头:

复制代码
GET /xxx HTTP/1.1
Host: 192.168.3.57:8080
...

Django 的 request.get_host() 就会返回 "192.168.3.57:8080"

build_absolute_uri() 内部正是基于这个值来拼接完整 URL 的。


⚠️ 注意:反向代理(如 Nginx)时需额外配置

如果你用 Nginx/Apache 做了反向代理(例如外网访问 http://example.com,内部转发到 http://127.0.0.1:8000),那么:

  • Django 收到的 Host 头可能是 127.0.0.1:8000(错误!)
  • 这会导致 build_absolute_uri() 生成内网地址,二维码在外网扫不了
✅ 解决方案(二选一):

方法 1:配置 Django 信任代理头(推荐)

settings.py 中添加:

复制代码
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

并确保 Nginx 配置传递了正确头:

复制代码
location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;               # 👈 关键
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
}

方法 2:开发/内网环境无需担心

如果你直接用 http://IP:端口 访问(没有反向代理),一切正常,无需任何配置


✅ 总结

用户访问方式 build_absolute_uri() 生成的 URL
http://192.168.1.100:8080/... http://192.168.1.100:8080/目标路径
https://example.com/... https://example.com/目标路径
http://localhost:8000/... http://localhost:8000/目标路径

🎯 你不需要做任何特殊处理 ------ 只要用户能访问你的页面,build_absolute_uri() 就能生成他"当前所见"的完整地址,完美用于二维码、分享链接等场景。

相关推荐
做怪小疯子6 小时前
华为笔试0429
python·numpy
Warson_L6 小时前
Dictionary
python
北方的流星7 小时前
华三路由器NAT配置
运维·网络·华三
数据法师8 小时前
开源情报收集工具GhostTrack深度测评:IP、手机号、用户名的合规信息查询方案
网络·网络协议·tcp/ip
寒山李白8 小时前
解决 python-docx 生成的 Word 文档打开时弹出“无法读取内容“警告
python·word·wps·文档·docx·qoder
2401_832365529 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
Sirius.z9 小时前
第J3周:DenseNet121算法详解
python
2301_779622419 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
丑八怪大丑9 小时前
Java网络编程
linux·服务器·网络
2301_766283449 小时前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python