我正在学习Django polls教程,它100%使用内置开发服务器(python3 manage.py runserver
)。
我已经设置了lighttpd来通过UWSGI服务django,看起来运行良好,但是有一个小故障:传递给django的URL似乎已被修改。
我的lighttpd配置基本上是这样的:
...
server.modules += ("mod_scgi","mod_rewrite")
scgi.protocol = "uwsgi"
scgi.server = (
"/polls" => ((
"host" => "localhost",
"port" => 7000,
"check-local" => "disable",
))
)
Django教程Map如下所示:
# tutorial1/urls.py
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
# polls/urls.py
app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]
然而,当我点击地址栏中的http://localhost:8080/polls/
时,它产生了404错误。
如果我添加一个额外的/polls
的网址,那么它的工作就很好。
我在本练习中的目标是能够在两个服务器之间切换,而不需要每次都修改配置文件。
我需要在lighttpd.conf
端做什么才能让lighttpd和Django自己的内部开发服务器互换?
我尝试添加以下url.rewrite
规则,但它完全搞乱了URL处理。
url.rewrite = (
"^/polls/(.*)$" => "/polls/polls/$1"
)
通过URL重写,第一次调用http://127.0.0.1/polls/
工作正常,但详细帖子的链接生成为http://127.0.0.1/polls/polls/1
,并且polls/urls.py
设置无法识别生成的子URL polls/1
。
使用lighttpd服务器中的空路径:
scgi.protocol = "uwsgi"
scgi.server = (
"" => ((
"host" => "localhost",
"port" => 7000,
"check-local" => "disable",
))
)
会产生一个奇怪的结果:
Raised by: polls.views.DetailView
意味着URL实际上被正确解析并转发到了PollsDetail视图,这是100%正确的处理程序,但它不知何故引发了404?WTF
谢谢大家!
1条答案
按热度按时间nhaq1z211#
如上所述here
某些版本的Lighttpd需要设置变量
fix-root-scriptname
,以修复Lighttpd在运行根目录为/的SCGI服务器时的一个bug。之前的答案:
你试过使用空字符串吗?(这不是一个正确的答案,但我不能作出评论)