سؤال

ولقد تقدمت handler404 مخصص لموقع على شبكة الانترنت جانغو مصادقة لتجنب تسرب المعلومات.

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

وظيفيا يفعل بالضبط ما أريد. ولكن الصفحة عودة 404 لديها الحالة 200، وهو الصحيح رمز الحكمة. ولكن هذا يحتاج من الواضح أن وضع 404 العودة.

وA raise404 لا تعمل، لأنه إن لم يكن إنهاء في العودية لانهائية، ويأتي إلى هنا، وبالتالي النتائج في نفس القضية.

وحاولت HttpResponseNotFound، ولكن هذا يستغرق سوى سلسلة كوسيطة وليس القالب، وهي ليست لتجف العش.

وحاولت يدويا لضبط رأس مع:

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

وبعد ذلك يتم تعيين رأس الوضع في الواقع ولكن المتصفح لا يزال يظهر حتى 200.

وأنا خارج من الخيارات .. أي شخص لديه نصائح، يرجى أن يكون بطلي ...:)

وثنإكس والتحيات،

وجيرارد.

تعديل : في حاولت قيمة الحقل الوضع في كل نوع راجع للشغل، ولكن لا حظ: (

هل كانت مفيدة؟

المحلول

وكنت تستخدم render_to_string و HttpResponseNotFound ، على سبيل المثال return HttpResponseNotFound(render_to_string('404.html')).

نصائح أخرى

وأخيرا وجدت السبب في أن عاد العمل رمز الحالة لم أكن. بدلا من وضع رسالة الرأس، هو ببساطة:

response.status_code = 404

وعلى الرغم من ذلك، رمز اقترحه PiotrLegnica يفوز بالتأكيد على البساطة، قراءة والجمال .. وشارة لا يزال قائما.)

والتحيات،

وجيرارد.

وبناء على الاقتراحات المذكورة أعلاه، وهنا هو بلدي مقطعة 404، 500 معالجات:

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

لماذا لا مجرد استخدام استثناء Http404؟

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

وينبغي أن يكون على ما يرام بالنسبة لك.

هل يمكن أن تفعل شيئا كما في المثال أدناه.

وفي إضافة urls.py التطبيق الخاص بك:

# 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

وفي إضافة views.py التطبيق الخاص بك:

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

والسر هو في السطر الأخير: الحالة = 404

ونأمل أن ساعد!

وإنني أتطلع إلى رؤية مدخلات المجتمع لهذا النهج. =)

ويمكنك استخدام أسلوب render:

from django.shortcuts import render
<اقتباس فقرة>   

وإرجاع HttpResponse الذي شغل مع نتيجة المحتوى   داعيا django.template.loader.render_to_string () مع مر   الحجج.

     

ويستخدم RequestContext افتراضيا.

مثال:

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

ومع الكلمات الرئيسية:

return render(request, '404.html', {'data': 'some data'}, status=404)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top