localhost:8000与http://127.0.0.1:8000的区别及Django+React Redux认证问题咨询
问题解答:localhost:8000 vs 127.0.0.1:8000的POST请求差异
咱先把问题拆成两部分来唠,你就能明白为啥会出现这种奇怪的情况了:
1. localhost:8000 和 http://127.0.0.1:8000 是一回事吗?
不完全是!
localhost是一个域名,系统默认会把它解析到回环地址——现在很多系统优先解析成IPv6的::1,也有些会同时解析IPv4的127.0.0.1。127.0.0.1是明确的IPv4回环地址,没有歧义。
简单说:localhost是个“别名”,可能指向IPv6或IPv4;127.0.0.1就是固定的IPv4本地地址。浏览器会把它们当成不同的源,这是关键!
2. 为啥POST请求只有localhost能正常工作?
核心原因是跨域(CORS)或者Django的访问权限配置:
- 首先看Django的
settings.py里的ALLOWED_HOSTS:如果这里只写了['localhost'],没加'127.0.0.1',那用127.0.0.1访问时,Django会直接拒绝请求(返回400或403错误)。 - 其次是CORS配置:如果你用了
django-cors-headers这类跨域插件,CORS_ALLOWED_ORIGINS里只加了http://localhost:8000,没加http://127.0.0.1:8000,浏览器就会拦截127.0.0.1的POST请求——因为浏览器认为这是跨域请求,而服务器没允许这个源。
3. 怎么解决这个问题?
直接把两个地址都加入允许列表就行:
- 修改
ALLOWED_HOSTS:ALLOWED_HOSTS = ['localhost', '127.0.0.1'] - 如果用了django-cors-headers,修改
CORS_ALLOWED_ORIGINS:CORS_ALLOWED_ORIGINS = [ "http://localhost:8000", "http://127.0.0.1:8000", ]
改完重启Django服务,再用127.0.0.1:8000发POST请求试试,应该就正常了。
内容的提问来源于stack exchange,提问作者Abhishek Pratap Singh




