如何在Django Python中获取HTTP_CF_IPCOUNTRY参数得到国家代码
Django 无法获取 HTTP_CF_IPCOUNTRY 头解决方案
排查解决步骤
- 首先确认Cloudflare侧配置正确
- 登录Cloudflare站点控制台,进入「网络」设置页,确认「IP地理定位」开关处于开启状态
- 进入「规则」→「转换规则」→「修改请求头」,确认
Add visitor location headers规则已启用,其中CF-IPCountry请求头处于开启状态
注意:如果你的服务没有接入Cloudflare代理,或者本地开发环境直接访问服务没有走Cloudflare链路,请求里自然不会携带该头,本地测试可以手动模拟请求头验证逻辑正确性。
- 确认中间代理已透传该请求头
如果你的Django服务前面部署了Nginx、Apache等反向代理,需要确认代理配置允许传递CF-IPCountry头,以Nginx为例,需要在站点配置的server/location块中添加:
proxy_set_header CF-IPCountry $http_cf_ipcountry;
- 排查Django侧头接收逻辑
Django默认会将请求头名称转为全大写、横杠替换为下划线、前缀加HTTP_后存入request.META,CF-IPCountry转换后确实是HTTP_CF_IPCOUNTRY,无需额外修改命名。如果仍然拿不到,可以先打印所有HTTP开头的元数据确认头是否存在:
def register(request): # 临时打印所有HTTP头排查 for k, v in request.META.items(): if k.startswith('HTTP_'): print(k, v) country_code = request.META.get('HTTP_CF_IPCOUNTRY', 'N/A').strip() print("THIs is ",country_code)
- 本地开发临时验证方案
本地开发环境没有走Cloudflare的话,可以在请求时手动携带该头测试逻辑,比如用curl请求:curl -H "CF-IPCountry: US" http://本地服务地址/register
此时Django应该能正常拿到US作为国家代码。
内容的提问来源于stack exchange,提问作者Ahmed Yasin
相关产品推荐
相关产品推荐

