Django zakázku handler404 ukazuje 404, ale dává hlavu 200

hlasů
8

Udělal jsem vlastní handler404 na ověřené webové stránky Django se zabránilo úniku informací.

def check_logged_in_404(request):
     Custom 404. Show friendly 404 when logged in and redirect to /login
    when not logged in.
    
    if request.user.is_authenticated():
        return render_to_response('404.html')
    else:
        return HttpResponseRedirect('/login')

Funkčně to dělá přesně to, co chci. Nicméně návrat strana 404 má statut 200, což je správný kód-moudrý. Ale to samozřejmě musí být status 404 návrat.

Raise404 nefunguje, protože pokud nebude končit v nekonečnou rekurzi, jde sem, a tudíž vede k téže věci.

Zkoušel jsem HttpResponseNotFound, ale to trvá jen řetězec jako argument a nikoli šablony, který není na Dry-ish.

A já ručně se snažil nastavit záhlaví s:

    response = render_to_response('404.html')
    response['Status'] = Not Found - 404
    return response

Pak záhlaví stav byl skutečně nastaven ale prohlížeč stále zobrazuje až 200.

Jsem z možností .. Každý, kdo má tipy, prosím můj hrdina ... :)

Dík a jde,

Gerard.

Edit : Zkoušel jsem hodnotu status pole v všeho druhu BTW, ale ne štěstí :(

Položena 28/11/2009 v 13:56
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
21

Já bych použít render_to_stringi HttpResponseNotFoundnapř return HttpResponseNotFound(render_to_string('404.html')).

Odpovězeno 28/11/2009 v 14:08
zdroj uživatelem

hlasů
12

Nakonec jsem zjistil, proč vrácený stavový kód didnt práce. Namísto stanovení zprávu hlavičky, to prostě je:

response.status_code = 404

Nicméně, kód navrhl PiotrLegnica definitivně vítězí na jednoduchost, srozumitelnost a krásu .. Odznak dodnes stojí)

Pozdravy,

Gerard.

Odpovězeno 28/11/2009 v 16:37
zdroj uživatelem

hlasů
2

Proč ne jen používat Http404 výjimku?

if request.user.is_authenticated():
    raise Http404
else:
    return HttpResponseRedirect('/login')

To by mělo být v pohodě pro vás.

Odpovězeno 28/11/2009 v 17:08
zdroj uživatelem

hlasů
1

Dalo by se udělat něco takového příkladu níže.

Do urls.py doplňkem vaší aplikace:

# Imports
from django.conf.urls.static import static
from django.conf.urls import handler404
from django.conf.urls import patterns, include, url
from yourapplication import views

##
# Handles the URLS calls
urlpatterns = patterns('',
    # url(r'^$', include('app.homepage.urls')),
)

handler404 = views.error404

Do views.py doplňkem vaší aplikace:

# Imports
from django.shortcuts import render
from django.http import HttpResponse
from django.template import Context, loader


##
# Handle 404 Errors
# @param request WSGIRequest list with all HTTP Request
def error404(request):

    # 1. Load models for this view
    #from idgsupply.models import My404Method

    # 2. Generate Content for this view
    template = loader.get_template('404.htm')
    context = Context({
        'message': 'All: %s' % request,
        })

    # 3. Return Template for this view + Data
    return HttpResponse(content=template.render(context), content_type='text/html; charset=utf-8', status=404)

Tajemství je v posledním řádku: status = 404

Doufám, že to pomohlo!

Těším se podívat na komunitní vstupy s tímto přístupem. =)

Odpovězeno 26/04/2013 v 15:11
zdroj uživatelem

hlasů
7

Na základě podnětů nad bázi, tady je moje krátká verze 404, 500 manipulátory:

def handler404(request):
    response = render_to_response('404.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 404
    return response


def handler500(request):
    response = render_to_response('500.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 500
    return response
Odpovězeno 02/08/2013 v 06:54
zdroj uživatelem

hlasů
1

Můžete použít rendermetodu:

from django.shortcuts import render

Vrací HttpResponse, jehož obsah je naplněn výsledek volání django.template.loader.render_to_string () s předaných argumentů.

Používá RequestContext ve výchozím nastavení.

Příklad:

return render(request, '404.html', status=404)

A pomocí klíčových slov:

return render(request, '404.html', {'data': 'some data'}, status=404)
Odpovězeno 02/02/2015 v 21:38
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more