Django路由在PlanetHoster远程服务器无法正常工作求助
解决Django部署到PlanetHoster后allauth路由异常问题
从你的描述来看,本地测试一切正常,但部署到PlanetHoster后遇到的路由问题,核心原因是你的应用被部署在了子路径(my_domain/my_app/)下,而Django和allauth默认是按根路径(/)来处理路由和重定向的。下面是针对性的解决方案:
1. 配置Django的子路径前缀
首先要告诉Django你的应用运行在子路径下,在settings.py中添加:
FORCE_SCRIPT_NAME = '/my_app' # 这里替换成你实际的子路径部分
这个配置会让Django在生成所有URL时自动加上这个前缀,解决重定向跳转到根域名的问题。
2. 修正allauth的路由和重定向配置
调整urls.py的路由写法
把allauth的路由改成更简洁的path写法(虽然re_path也能工作,但path更符合Django3+的最佳实践),同时保留根视图:
from django.contrib import admin from django.urls import path, include from django.conf import settings from django.http import HttpResponse from machina import urls as machina_urls from allauth.account import views def empty_view(request): return HttpResponse("Empty View") urlpatterns = [ path('', empty_view, name='empty_view'), # 保留这个根视图,避免路由解析混乱 path('admin/', admin.site.urls), # 注意这里加了斜杠,避免访问admin时出现重定向问题 path('account/', include('allauth.urls')), ]
更新settings里的重定向URL
把所有重定向路径改成包含子前缀的绝对路径,或者用FORCE_SCRIPT_NAME动态生成:
# 方式一:直接写绝对路径(直观) LOGIN_URL = '/my_app/account/login' LOGIN_REDIRECT_URL = '/my_app/projects/project/' ACCOUNT_LOGOUT_REDIRECT_URL = "/my_app/account/login" # 方式二:用FORCE_SCRIPT_NAME动态生成(更灵活,子路径变化时无需逐一修改) LOGIN_URL = f"{FORCE_SCRIPT_NAME}/account/login" LOGIN_REDIRECT_URL = f"{FORCE_SCRIPT_NAME}/projects/project/" ACCOUNT_LOGOUT_REDIRECT_URL = f"{FORCE_SCRIPT_NAME}/account/login"
3. 为什么启用empty_view后就正常?
当你没有根路径视图时,Django在解析my_domain/my_app/时,会把/my_app/当作根路径来匹配路由,导致allauth的account/路由解析出现混乱。而添加根视图后,Django能明确区分根路径和子路由,account/的解析就会正常工作。所以建议保留这个根视图(或者替换成你实际的首页视图)。
4. 检查PlanetHoster的部署配置
确认PlanetHoster的控制面板或.htaccess配置中,是否把你的Django应用正确映射到了/my_app子路径下。比如如果用WSGI部署,确保WSGI脚本的SCRIPT_NAME设置和你在Django中配置的FORCE_SCRIPT_NAME一致。
验证步骤
修改完成后重新部署应用,测试以下场景:
- 访问
my_domain/my_app/account/login/应该正常显示登录页面 - 登录成功后会正确跳转到
/my_app/projects/project/ - 访问
my_domain/my_app/不会再出现路由匹配错误 - 访问
my_domain/my_app/account/会显示allauth的账号相关路由列表(如果没有自定义account首页的话,会提示空路径不匹配,这是正常的,因为allauth的account/下需要具体的子路由比如login/、signup/)
内容的提问来源于stack exchange,提问作者Scenarmag Scenarmag
相关产品推荐
相关产品推荐

