在lighttpd下提供Django "投票"教程时出现问题:404页面未找到

r3i60tvu  于 2023-01-27  发布在  Go
关注(0)|答案(1)|浏览(91)

我正在学习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
谢谢大家!

nhaq1z21

nhaq1z211#

如上所述here
某些版本的Lighttpd需要设置变量fix-root-scriptname,以修复Lighttpd在运行根目录为/的SCGI服务器时的一个bug。

scgi.server   = (
    "/" => ((
             "host" => "localhost",
             "port" => 7000,
             "check-local" => "disable",
             "fix-root-scriptname" => "enable",
    ))

之前的答案:
你试过使用空字符串吗?(这不是一个正确的答案,但我不能作出评论)

相关问题