محرك تطبيقات جوجل والخطأ 404
-
06-07-2019 - |
سؤال
لقد قمت بإعداد موقع ويب ثابت على 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))