سؤال

لقد قمت بإعداد موقع ويب ثابت على GAE باستخدام تلميحات موجودة في مكان آخر، لكن لا يمكنني معرفة كيفية إرجاع الخطأ 404.يبدو ملف app.yaml الخاص بي

- url: (.*)/
  static_files: static\1/index.html
  upload: static/index.html

- url: /
  static_dir: static

مع كافة ملفات html/jpg الثابتة المخزنة ضمن الدليل الثابت.يعمل ما سبق مع الملفات الموجودة، ولكنه يُرجع ملفًا فارغًا إذا لم يكن كذلك.ربما تكون الإجابة هي كتابة برنامج نصي بيثون لإرجاع خطأ 404، ولكن كيف يمكنك إعداد الأشياء لخدمة الملفات الثابتة الموجودة ولكن تشغيل البرنامج النصي للملفات غير الموجودة؟

فيما يلي سجل جلب ملف غير موجود (no such.html) على خادم تطبيق التطوير:

ERROR    2008-11-25 20:08:34,084 dev_appserver.py] Error encountered reading file "/usr/home/ctuffli/www/tufflinet/static/nosuch.html":
[Errno 2] No such file or directory: '/usr/home/ctuffli/www/tufflinet/static/nosuch.html'
INFO     2008-11-25 20:08:34,088 dev_appserver.py] "GET /nosuch.html HTTP/1.1" 404 -
هل كانت مفيدة؟

المحلول

وتحتاج لتسجيل والتقاط كل معالج النصي. إلحاق هذا في نهاية app.yaml الخاص بك:

- url: /.*
  script: main.py

في main.py سوف تحتاج لوضع هذا الرمز:

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class NotFoundPageHandler(webapp.RequestHandler):
    def get(self):
        self.error(404)
        self.response.out.write('<Your 404 error html page>')

application = webapp.WSGIApplication([('/.*', NotFoundPageHandler)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

واستبدال <Your 404 error html page> مع شيء مفيد. أو أفضل استخدام قالب، يمكنك قراءة كيفية القيام بذلك rel="noreferrer"> .

واسمحوا لي أن أعرف إذا كان لديك مشاكل إعداد هذا.

نصائح أخرى

محرك تطبيقات جوجل لديه الآن استجابات الأخطاء المخصصة

لذا يمكنك الآن إضافة قسم error_handlers إلى app.yaml الخاص بك، كما في هذا المثال:

error_handlers:

- file: default_error.html

- error_code: over_quota
    file: over_quota.html

وهناك طريقة أبسط بكثير للقيام بذلك دون الحاجة إلى أي دورات CPU هو وضع معالج هذا في الجزء السفلي من app.yaml بك

- url: /.*
    static_files: views/404.html
    upload: views/404.html

وهذا ثم يسمح لك لوضع ملف 404.html ثابت في دليل وجهات نظركم. لا حاجة لمعالج الثعبان. أي شيء التي لم يتم معالجتها في app.yaml الخاص بك بالفعل سوف تصل بذلك.

ويمكنك إنشاء دالة لمعالجة الأخطاء للحصول على أي من رموز الحالة. كنت حالة يجري 404، تعريف دالة مثل هذا:

def Handle404(request, response, exception):
     response.out.write("Your error message") 
     response.set_status(404)`

ويمكنك تمرير أي شيء - HTML / نص عادي / القوالب في وظيفة response.out.write. الآن، إضافة تعريف التالية بعد إعلان app الخاص بك.

وapp.error_handlers[404] = Handle404

وهذا عمل بالنسبة لي.

وwebapp2 يوفر القاموس error_handlers التي يمكنك استخدامها لخدمة صفحات الخطأ المخصصة. المثال التالي:

def handle_404(request, response, exception):
    logging.warn(str(exception))
    response.set_status(404)
    h = YourAppBaseHandler(request, response)
    h.render_template('notfound')

def handle_500(request, response, exception):
    logging.error(str(exception))
    response.set_status(500)
    h = YourAppBaseHandler(request, response)
    h.render_template('servererror')

app = webapp2.WSGIApplication([
    webapp2.Route('/', MainHandler, name='home')
    ], debug=True)
app.error_handlers[404] = handle_404
app.error_handlers[500] = handle_500

وهي مزيد من التفاصيل المتاحة على صفحات الوثائق webapp2 ل: HTTP: // تطبيق الويب -improved.appspot.com/guide/app.html#error-handlers

ووdev_appserver تعود بالفعل 404 الردود عن أي شيء لا يطابق رسم الخرائط، أو لا تتناسب مع الخرائط ولكن لا وجود لها. رد 404 في حد ذاته ليس لديه الجسم، لكنه ما زال 404:

$ wget -O - http://127.0.0.1:8080/foo
--2010-10-28 10:54:51--  http://127.0.0.1:8080/foo
Connecting to 127.0.0.1:8080... connected.
HTTP request sent, awaiting response... 404 
2010-10-28 10:54:51 ERROR 404: (no description).

$ wget -O - http://127.0.0.1:8080/foo/
--2010-10-28 10:54:54--  http://127.0.0.1:8080/foo/
Connecting to 127.0.0.1:8080... connected.
HTTP request sent, awaiting response... 404 
2010-10-28 10:54:54 ERROR 404: (no description).

إذا كنت ترغب في إرجاع أكثر من صفحة خطأ سهل الاستعمال، اتبع نصيحة jonmiddleton وتحديد صفحة مخصصة 404.

لقد قمت بمراجعة جميع الإجابات المذكورة أعلاه واستخدمت ما يلي في النهاية باعتباره الحل 404 الأكثر عالمية:

أضف هذا الرابط في نهاية app.yaml

- url: /(.*) 
  script: 404.app

وإنشاء 404.py مع المحتوى التالي

import webapp2
from google.appengine.ext.webapp import template

class NotFound(webapp2.RequestHandler):
  def get(self):
    self.error(404)
    self.response.out.write(template.render('404.html', {}))

app = webapp2.WSGIApplication([
    ('/.*', NotFound)
], debug=True)

سيؤدي هذا إلى عرض محتويات 404.html الملف مع رمز الخطأ 404.

وميزة هذا الحل هي البساطة وصحة السلوك والمرونة، كما يسمح باستخدام ثابت 404.html الملف كمحتوى صفحة الخطأ.

أريد أيضًا أن أحذر من بعض الحلول المقترحة أعلاه.

  • Custom Error Responses لا تعمل مع خطأ 404
  • لا تستخدم أيضًا الملفات الثابتة، لأنها ستعرض الخطأ 200 بدلاً من 404.هذا يمكن أن يسبب الكثير من الصداع في المستقبل.

وأنا لا أستطيع التعليق على الجواب jonmiddleton، ولكن ردود الخطأ مخصص لأخطاء محددة محرك التطبيقات من خلال نظرة منه. أنا لا أرى وسيلة لتحديد صفحة مخصصة 404.

وجانغو دعونا لك تحديد واحد بالرغم من ذلك.

وتوجهي هو التعامل مع كل من 404 و دائمة الموجهات في الصيد كل معالج أن أضع كآخر واحد. هذا هو مفيدة عندما كنت إعادة تصميم والتطبيق وإعادة تسمية عناوين المواقع / بديل:

app = webapp2.WSGIApplication([
    ...
    ...
    ('/.*', ErrorsHandler)
], debug=True)


class ErrorsHandler(webapp2.RequestHandler):
    def get(self):
        p = self.request.path_qs
        if p in ['/index.html', 'resources-that-I-removed']:  
            return self.redirect('/and-substituted-with-this', permanent=True)
        else: 
            self.error(404)
            template = jinja_environment.get_template('404.html')
            context =  {
                'page_title': '404',
            }
            self.response.out.write(template.render(context))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top