Question

J'ai créé un handler404 personnalisé pour un site Web Django authentifié afin d'éviter les fuites d'informations.

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')

Fonctionnellement, il fait exactement ce que je veux. Cependant, la page de retour 404 a un statut 200, ce qui est correct dans le code. Mais cela doit évidemment être un statut de retour 404.

Une augmentation404 ne fonctionne pas car, si elle ne se termine pas par une récursion infinie, elle revient ici et entraîne le même problème.

J'ai essayé un HttpResponseNotFound, mais cela ne prend qu'une chaîne en tant qu'argument et non un modèle, ce qui ne signifie pas DRY-ish.

Et j'ai essayé manuellement de définir l'en-tête avec:

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

Ensuite, l'en-tête d'état est bien défini mais le navigateur affiche toujours un 200.

Je n’ai plus d’options ... Si vous avez des conseils, soyez mon héros ...:)

Merci et salutations

Gérard.

Modifier : j'ai essayé la valeur du champ de statut dans tous les types, mais pas de chance: (

Était-ce utile?

La solution

Je voudrais utiliser < code> render_to_string et HttpResponseNotFound , par exemple return HttpResponseNotFound (render_to_string ('404.html')) .

Autres conseils

J'ai enfin trouvé pourquoi le code d'état renvoyé ne fonctionnait pas. Au lieu de définir un message d’en-tête, c’est simplement:

response.status_code = 404

Néanmoins, le code suggéré par PiotrLegnica gagne définitivement sur la simplicité, la lisibilité et la beauté. Le badge est toujours valable;)

Cordialement,

Gérard.

Sur la base des suggestions ci-dessus, voici ma version courte de 404, 500 gestionnaires:

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

Pourquoi n'utilisez-vous pas simplement l'exception HTTP404?

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

Cela devrait vous convenir.

Vous pouvez faire quelque chose comme l'exemple ci-dessous.

Dans l'urls.py de votre application, ajoutez:

# 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'^

Dans le fichier views.py de votre application, ajoutez:

# 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)

Le secret est à la dernière ligne: status = 404

J'espère que ça a aidé!

Je suis impatient de voir les contributions de la communauté à cette approche. =)

, include('app.homepage.urls')), ) handler404 = views.error404

Dans le fichier views.py de votre application, ajoutez:

<*>

Le secret est à la dernière ligne: status = 404

J'espère que ça a aidé!

Je suis impatient de voir les contributions de la communauté à cette approche. =)

Vous pouvez utiliser la méthode render :

from django.shortcuts import render
  

Renvoie une réponse HttpResponse dont le contenu est rempli avec le résultat de   appelant django.template.loader.render_to_string () avec le passé   arguments.

     

Utilise un RequestContext par défaut.

Exemple:

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

Et avec des mots clés:

return render(request, '404.html', {'data': 'some data'}, status=404)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top