我正在通过Coding为企业家做一些Django练习。 这是代码:
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from django.views import View
from .models import KirrURL
def kirr_redirect_view(request,shortcode=None,*args,**kwargs):
#Method 1:
obj = get_object_or_404(KirrURL, shortcode__iexact=shortcode)
obj_url = obj.url
#Method 2:
qs = KirrURL.objects.filter(shortcode__iexact=shortcode)
if qs.exists() and qs.count() == 1:
obj = qs.first()
obj_url = obj.url
return HttpResponse("Hello : {sr}".format(sr=obj_url))
我正在做的是从网址获取一些单词并将其传递给kirr_redirect_view,然后查询获取数据并返回一些单词。 该网站介绍了两种方法。第二种方法很好。当我改为第一种方法时。方法突然出错了,即使我传递了正确的关键词,我仍然从页面获得404.
答案 0 :(得分:2)
根据Django文档:
在给定的模型管理器上调用 get(),但它会引发Http404而不是模型的DoesNotExist异常。
因此,如果没有匹配的记录,get_object_or_404
将会引发404: content not found
。
如果在您的第二种方法中,如果没有匹配即您的if
失败,您仍然会发送您的HttResposne
对象,默认状态为200: OK
。
简而言之,您的KireURL
模型没有与shortcode__iexact=shortcode
匹配的记录。
答案 1 :(得分:0)
第二种方法是显示网址还是只是没有引发错误?过滤器永远不会引发任何异常,并且看起来它有超过1个具有相同短代码的对象,或者没有任何异常,并且如果有条件则进入。这就是get_object_or_404()引发异常的原因。
答案 2 :(得分:0)
我在这里添加一些信息。这是我使用python shell运行代码时得到的。
#!/bin/sh
tmux -2 attach-session -d