解决Django应用部署时激活链接缺少端口号的问题

引言

在当今技术迅速发展的时代,前后端分离已经成为现代Web开发的一项标准实践。然而,当我们将这些先进的架构部署到生产环境时,常常会遇到一些预料之外的挑战。

问题说明

在一个典型的例子中,我在Windows环境下开发了一个采用Django和Vue进行前后端分离的项目,并顺利完成了调试。随后,我开始在Linux CentOS环境上进行部署。我的项目使用了Django的Djoser库来实现注册功能,其中包括向注册邮箱发送激活链接的功能。然而,在部署过程中,我遇到了一个问题:发送到注册邮箱的激活链接缺少了端口号。

项目现状

我的Django项目的settings.py文件中关于Djoser的配置如下所示:

DJOSER = {'USER_ID_FIELD': 'username','LOGIN_FIELD': 'email','SEND_ACTIVATION_EMAIL': True,'ACTIVATION_URL': 'activate/{uid}/{token}','SEND_CONFIRMATION_EMAIL': True,'PASSWORD_RESET_CONFIRM_URL': 'password_reset/{uid}/{token}','PASSWORD_RESET_CONFIRM_RETYPE': True,'PASSWORD_RESET_SHOW_EMAIL_NOT_FOUND': True,'SET_PASSWORD_RETYPE': True,'SERIALIZERS': {"user_create": "account.serializers.CustomUserCreateSerializer","current_user": "account.serializers.CustomUserSerializer",}
}

我还配置了Nginx来反向代理Django应用,具体的Nginx配置如下:

location /api/ {proxy_pass http://backend/api/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;
}

分析原因

问题的根本原因在于,通过Nginx反向代理访问Django应用时,Django未能接收到原始请求中的端口信息。这是因为Nginx代理默认不转发原始请求的端口信息给上游应用。Django在生成完整URL时,依赖于接收到的请求信息。

问题解决

为了解决这个问题,我在Django项目的settings.py文件中做了如下配置:

# 使用X-Forwarded-Host头部,这个头部会包含原始的主机名和端口号
USE_X_FORWARDED_HOST = True# 当Django运行在HTTPS之后的反向代理后面时,告诉Django使用`X-Forwarded-Proto`头部识别协议
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

启用了USE_X_FORWARDED_HOST,允许Django使用X-Forwarded-Host头部,该头部包含了原始的主机名和端口号。
设置了SECURE_PROXY_SSL_HEADER为(‘HTTP_X_FORWARDED_PROTO’, ‘https’),当Django运行在HTTPS协议的反向代理后时,这告诉Django使用X-Forwarded-Proto头部来识别协议。
同时,我更新了Nginx的配置,增加了proxy_set_header X-Forwarded-Host h o s t : host: host:server_port;,确保Nginx将主机名和端口号通过X-Forwarded-Host头传递给Django应用:

location /api/ {proxy_pass http://backend/api/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Forwarded-Host $host:$server_port;
}

通过这些调整,我成功解决了激活链接缺少端口号的问题。这一经历再次强调了,无论技术多么先进,深入理解其背后的原理和细节始终是成功部署和维护项目的关键。我希望这篇文章能够帮助你在自己的项目中避免遇到类似的问题,并鼓励你探索技术的更多奥秘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离线环境怎么下载python依赖包

公司内网环境无网络,运行自动化脚本需要安装python模块 1、脚本依赖包及其版本获取,记录在requirements.txt中 pipreqs ./script --encodingutf8 requirements.txt注意,这里是将./script 里的python模块自动扫描并写入到requirements.txt中…

假期刷题打卡--Day23

1、MT1190分数乘法 输入5组分数,对他们进行乘法运算,输出结果。不考虑分母为0等特殊情况。 格式 输入格式: 输入整型,每组一行,如样例所示。 输出格式: 输出计算结果实型,如样例所示。 样…

[Vue3]父子组件相互传值数据同步

简介 vue3中使用setup语法糖,父子组件之间相互传递数据及数据同步问题 文章目录 简介父传子props传递值 使用v-bind绑定props需要计算toRefcomputed emit传递方法 使用v-on绑定 子传父expose v-model总结 父传子 props传递值 使用v-bind绑定 父组件通过props给子…

Python基础知识:Python与序列相关的内置函数

与序列相关的内置函数如表所示。 与序列相关的内置函数 函数的作用 len(seq) 计算序列的长度(包含多少个元素) max(seq) 查找序列中的最大元素 min(seq) 查找序列中的最小元素 list(seq) 将序列转换为列表,注意不能转换字典 str(se…

openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围

文章目录 openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围214.1 性能因素214.2 调优范围确定 openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围 数据库性能调优通常发生在用户对业务的执行效率不满意,期望通过调优加快业务执行的情况下。正…

如何解决部分图片读取转化异常的问题

问题描述 接触到一个数据集,有个别图片在读取转化的时候出现了异常,由于图片之间有关联,导致后续图片无法时候。 解决方法 将异常的图片转为白色或者黑色的图片,保证其他的图片可以正常使用!代码如下: …

两种方式实现文本超出指定行数显示展开收起...

需要实现这样一个功能 默认高度下文本超出隐藏&#xff0c;点击展开可查看所有内容&#xff0c;点击收起可折叠 方法一&#xff1a;通过html和css实现 代码部分 html:<div className"expand-fold"><input id"check-box" type"checkbox&qu…

【Android】240204 android studio build.gradle.kts APK名字带日期

通过Android studio 生成 APK 名字的时候&#xff0c;带年月日时&#xff0c;可以在 build.gradle 里面定义&#xff1b; 在Gradle脚本的build任务中&#xff0c;每当我构建项目时&#xff0c;我都希望获得当前时间戳&#xff0c;并将其保存到项目资源目录中的文件中。如果我理…

04-尚硅谷Vue_Vue中的ajax

文章目录 1. 解决开发环境 Ajax 跨域问题 【前端】尚硅谷Vue2-Vue3全家桶笔记目录贴 1. 解决开发环境 Ajax 跨域问题

Camunda会签、或签、比例签

&#x1f496;专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据&#xff0c;完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧&#x1f618; &#x1f496;说在前面 …

EasyX图形库学习(二、文字输出)

目录 一、文字绘制函数 字体属性结构体:logfont 文字输出 outtextxy 在指定位置输出字符串。 ​编辑 但如果直接使用,可能有以下报错&#xff1a; 三种解决方案&#xff1a; 将一个int类型的分数,输出到图形界面上 如果直接使用&#xff1a; 会把score输入进去根据A…

【C/C++ 13】C++11高效特性

目录 一、初始化列表 二、auto 三、decltype 四、可变参数列表 五、lambda表达式 C11在C98的基础上增添了许多特性&#xff0c;但是同时也使得C程序的开发变得复杂繁琐&#xff0c;让众多开发者苦不堪言&#xff0c;于是我们需要从C11新增舔的特性中选择一些能够提高开发效…

ROS从入门到精通4-1:Docker安装与常用命令总结

目录 0 专栏介绍1 Docker与机器人应用2 Docker安装步骤3 Docker常用命令3.1 创建与启动容器3.2 暂停与删除容器3.3 容器文件拷贝3.4 构建镜像与上下文 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0c;掌握ROS底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS进…

【文件增量备份系统】前端项目构建

文章目录 创建项目安装项目依赖引入element plus组件下载组件在main.js中使用组件测试 整合路由router下载组件创建路由管理器index.js使用路由App.vue上面使用 <router-view />测试 整合axios下载组件工具类axiosRequest.js工具类使用 创建项目 damwangrunqindeMBP dev…

车载测试中:如何处理 bug

一&#xff1a;Jira 提交 bug 包含那些内容 二&#xff1a;如何处理现上 bug 三&#xff1a;车载相关的 bug 如何定位 四&#xff1a;遇到 bug &#xff0c;复现不出来怎么办 五&#xff1a;bug 的处理流程 一&#xff1a;Jira 提交 bug 包含那些内容二&#xff1a;如何处理现上…

Java设计模式-模板方法模式(14)

行为型模式 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对…

uniapp android和微信小程序如何实现PDF在线预览

Hello大家好&#xff01;我是咕噜铁蛋&#xff0c;UniApp在开发移动应用时提供了跨平台的解决方案&#xff0c;能够同时支持Android和iOS系统&#xff0c;而微信小程序则是一种轻量级的应用形式&#xff0c;可以在微信内直接运行。本文将探讨如何利用UniApp和微信小程序实现PDF…

k8s学习-Kubernetes的网络

Kubernetes作为编排引擎管理着分布在不同节点上的容器和Pod。Pod、Service、外部组件之间需要⼀种可靠的方找到彼此并进行通信&#xff0c;Kubernetes网络则负责提供这个保障。 1.1 Kubernetes网络模型 Container-to-Container的网络 当Pod被调度到某个节点&#xff0c;Pod中…

java数组学习

目录 1.数组概念 2.数组的定义 3.数组的静态初始化 4.地址值 5.数组元素访问 6.索引 7.数组的遍历 8.数组的动态初始化 9.数组两种初始化方式的区别 10.数组常见问题 1.数组概念 数组是一种容器&#xff0c;可以同来存储同种数据类型的多个值。但是数组容器在存储数据…

Redis核心技术与实战【学习笔记】 - 24.Redis 脑裂

简述 所谓脑裂&#xff0c;就是指在主从集群中&#xff0c;同时有两个主节点&#xff0c;它们都能接收写请求。而脑裂最直接的影响就是客户端不知道该往哪个主节点写入数据&#xff0c;结果就是不同的客户端会往不同的主机诶点上写入数据。而且&#xff0c;严重的话&#xff0…