django get_object_or_404(),handler404,Http404响应,这些东西是怎么工作的?

cld4siwp  于 2023-05-01  发布在  Go
关注(0)|答案(1)|浏览(109)

你能帮我用Django吗?我想了解一下执行顺序404页面找不到错误
让我把代码放在这里。..
www.example. com ------------来自django项目的文件

from django.contrib import admin
from django.urls import path, include

from django.conf.urls import handler404, handler500

from core import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('core.urls')),
]

handler404 = views.error404
handler500 = views.error500

www.example. com ------------来自django app的文件

from django.urls import path

from .views import index
from .views import contact
from .views import product

urlpatterns = [
    path('', index, name='index'),
    path('contact', contato, name='contact'),
    path('product/<int:pk>', produto, name='product'),
]

view.py

def produto(request, pk):
    print(f'PK: {pk}')
    
    prod = get_object_or_404(Product, id=pk)
    context = {
        'product': prod
    }
    return render(request, 'product.html', context)

def error404(request, exception):
    template = loader.get_template('404.html')
    return HttpResponse(content=template.render(), content_type='text/html; charset=utf8', status=404)

def error500(request):
    template = loader.get_template('500.html')
    return HttpResponse(content=template.render(), content_type='text/html; charset=utf8', status=500)

我想了解以下几点:假设在表“Product”中只有5个示例。..所以对于第5个示例,URL是http://127.0.0.1:8000/product/5 ok?
让我们假设我试图获取表中不存在的第10个示例,那么代码行prod = get_object_or_404(Product, id=pk)将返回示例或返回错误404,在这种情况下将返回错误404,好吗?
因此,当我输入url http://127.0.0.1:8000/product/10时,这将命中url模式path('product/<int:pk>', produto, name='product'),,调用视图def produto(request, pk):。在该视图中,将不会检索该示例,并将释放错误404。
那么,错误404是如何发送到 www.example.com ?我不明白执行流程是怎么运作的。有人能给我解释一下吗
我已经描述了上下文。

5f0d552i

5f0d552i1#

在到视图的路上,请求正在传递在设置上定义的所有中间件层。MIDDLEWARE和向后,同样适用于响应。就像洋葱的一层层。
在返回的过程中,如果视图或中间件层之一引发异常,则调用中间件方法process_exception()(https://docs.djangoprojectcom/en/4.2/topics/http/middleware/#process-exception)和40x等。处理程序被调用,反过来将异常转换为状态为40 x的HttpResponse返回给调用浏览器。 www.example.com

相关问题