Pergunta

Eu fiz uma handler404 personalizado para um site autenticado Django ao vazamento de informações evitar.

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

Funcionalmente ele faz exatamente o que eu quero. No entanto, a página de retorno 404 tem um status de 200, o que é correto código-wise. Mas isso, obviamente, precisa ser um status 404 retorno.

A raise404 não funciona porque, se não terminando em uma recursão infinita, ele volta aqui e, portanto, resulta no mesmo problema.

Eu tentei um HttpResponseNotFound, mas isso só leva uma string como um argumento e não um modelo, o que não é DRY-ish.

E eu tentei manualmente para definir o cabeçalho com:

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

Em seguida, o cabeçalho de estado é de fato definido, mas o navegador mostra ainda acima de 200.

Eu estou fora das opções .. Qualquer um que tem dicas, seja por favor meu herói ...:)

Thanx e cumprimentos,

Gerard.

Editar : Eu tentei o valor do campo de status em todos os tipos btw, mas sem sorte: (

Foi útil?

Solução

Eu usaria render_to_string e HttpResponseNotFound , por exemplo, return HttpResponseNotFound(render_to_string('404.html')).

Outras dicas

Eu finalmente encontrei por isso que o retornado trabalho código de status não funcionavam. Em vez de definir uma mensagem de cabeçalho, ele simplesmente é:

response.status_code = 404

No entanto, o código sugerido por PiotrLegnica definitivamente ganha em simplicidade, legibilidade e beleza .. O emblema ainda está de pé;)

Saudações,

Gerard.

Com base em sugestões acima, aqui é a minha versão curta de 404, 500 manipuladores:

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

Por que você não apenas usar Http404 exceção?

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

Isso deve ficar bem para você.

Você poderia fazer algo parecido com o exemplo abaixo.

Em complemento urls.py do seu aplicativo:

# 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

Em complemento views.py do seu aplicativo:

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

O segredo está na última linha: status = 404

espero que ajudou!

Estou ansioso para ver as entradas da comunidade para esta abordagem. =)

Você pode usar o método render:

from django.shortcuts import render

Retorna um HttpResponse cujo conteúdo é preenchido com o resultado de chamando django.template.loader.render_to_string () com o passado argumentos.

Usa um RequestContext por padrão.

Exemplo:

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

E com palavras-chave:

return render(request, '404.html', {'data': 'some data'}, status=404)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top