10

我正在创建一个 django 应用程序。用户登录并显示由 flatpages 应用程序管理的静态网页。

以下是来自开发服务器的典型状态消息:

 [15/Aug/2013 18:43:16] "GET / HTTP/1.1" 200 1263
 [15/Aug/2013 18:43:23] "POST / HTTP/1.1" 302 0
 [15/Aug/2013 18:43:23] "GET /home HTTP/1.1" 301 0
 [15/Aug/2013 18:43:23] "GET /home/ HTTP/1.1" 200 4529
  • 第一行是 / 处的登录页面。这服务成功,代码 200。
  • 第二行是表单输入。服务器响应码为 302,表示页面暂时移动。
  • 第三行是尝试检索一个不存在的页面('/home'),因为底层页面是由平面页面提供的。301 服务器响应代码表示该页面已被永久移动。
  • 第四行是从平面页面成功交付内容('/home')。

为什么服务器会以 302 响应 put 请求?

是什么导致了第三行?为什么会发出这条消息?这不应该是 flatpages 中间件捕获的东西吗?我的 Web 客户端是否在第四行下发送请求?它怎么知道这样做?

我想最重要的问题是:我做错了什么吗?

谢谢您的帮助!

网址.py

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', 'django.contrib.auth.views.login'),
    url(r'^logout$', 'guide.views.logout_view'),
    # other patterns
    (r'', include('django.contrib.flatpages.urls')),
)

视图.py

def home(request):
    if request.user.is_authenticated() == False:
        return HttpResponseRedirect('/')
    return HttpResponseRedirect('/home/')

摘自 settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
    'guide.middleware.LogActivity'
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.flatpages',
    'django.contrib.admin',
    'guide',
)
4

3 回答 3

9

我看不到您的主页视图的 url 模式。但这可能是缺少的斜线使 django 发出自动重定向:

https://docs.djangoproject.com/en/dev/ref/settings/#append-slash

我的 Web 客户端是否在第四行下发送请求?它怎么知道这样做?

是的,第 3 行中的状态码 301告诉浏览器“您请求的页面已移至另一个 url x”。并且浏览器通常会自动向第 4 行的新 url x 发送一个新请求。

于 2013-08-16T04:48:10.870 回答
3

根据 user640916 的提示,这是我清理错误的方法。

在 urls.py 中,我添加了:

url(r'^home$', 'guide.views.home'),

在views.py中,我添加了:

from django.contrib.flatpages.views import flatpage

def home(request):
    return flatpage(request, "/home/")

我的登录服务器状态消息现在如下所示:

[17/Aug/2013 09:13:52] "GET / HTTP/1.1" 200 1263
[17/Aug/2013 09:14:00] "POST / HTTP/1.1" 302 0
[17/Aug/2013 09:14:00] "GET /home HTTP/1.1" 200 4529

不完全是我想要的,但它有效。我仍然觉得我做的不对。似乎 django.contrib.auth 会自动在 url "/home" 处查找主页视图,而没有尾部斜杠。

于 2013-08-17T16:23:09.650 回答
3

我无法发表评论或投票,但想为其他人添加https://stackoverflow.com/a/18265990/4651336上的beluga.me ,我在success_url后缺少斜杠。

这:

success_url = 'step-two'

变成:

success_url = 'step-two/'

修复。

于 2016-04-08T21:12:00.710 回答