Heim > Backend-Entwicklung > Python-Tutorial > Detaillierte Einführung in die Django-Middleware

Detaillierte Einführung in die Django-Middleware

零下一度
Freigeben: 2017-07-18 10:49:55
Original
1942 Leute haben es durchsucht

Ich schreibe seit ein paar Wochen Skripte und habe heute endlich angefangen, mit Web-Frameworks in Kontakt zu kommen ~ Um das Web-Framework von Python zu erlernen, ist Django fast ein Pflichtkurs. Dieses Mal werde ich beginnen Die Hauptaufgabe besteht darin, die Versionsnummer in der Einstellung hinzuzufügen, die Versionsnummer beim Rendern des statischen CSS- und JS-Pfads anzuhängen, z. B. „example.v1124.css“ und dann die Versionsnummer in der Anforderung zu entfernen Anfrage. Warum das tun? Denn wenn Sie dies tun, wird der Pfad zur statischen Dateiausgabe im Frontend mit der Versionsnummer hinzugefügt. Auf diese Weise aktualisiert der Client den lokalen Cache zwangsweise Zu diesem Zweck müssen Sie zuerst Es muss in der Einstellungsdatei konfiguriert werden, damit die Versionsnummer bei jeder Änderung direkt aus den Einstellungen gelesen werden kann

1. Anforderungszyklus der Django-Middleware

Wir senden eine Anfrage vom Browser und erhalten einen Antwortinhalt HttpResponse. Der Prozess zum Übergeben dieser Anfrage an Django ist wie folgt:

In Mit anderen Worten, jede Anfrage wird zuerst über die Funktion „process_request“ in der Middleware zurückgegeben. Wenn sie das erstere zurückgibt, fahren Sie mit der Verarbeitung anderer Middleware fort. Wenn sie eine „HttpResponse“ zurückgibt, wird die Verarbeitung abgebrochen und an die Webseite zurückgegeben .

2. Middleware anpassen und registrieren

1. Middleware erstellen

Erstellen Sie die Middleware-PY-Datei im Projektstammverzeichnis:

 1 class RequestExeute(object): 2     def process_request(self, request): 3         print('process_request') 4  5     def process_view(self, request, callback, callback_args, callback_kwargs): 6         print('process_view') 7  8     def process_exception(self, request, exception): 9         """10         当views函数出错时执行11         :param request: 
12         :param exception: 
13         :return: 
14         """15         print('process_exception')16         17     def process_response(self, request, response):18         """19         必须return HttpResponse20         :param request: 
21         :param response: 
22         :return: 
23         """24         print('process_response')25         return response26 27     def process_template_response(self, request, response):28         """29         视图函数的返回值中,如果有render方法,才被调用30         :param request:31         :param response:32         :return:33         """34         print('process_template_response')35         return response
Nach dem Login kopieren
md.py

2. Registrieren Sie die Middleware

Befolgen Sie in der Datei „settings.py“ die Anweisungen, die Sie Sequential ausführen möchten Registrierung:

ps. In Versionen 1.9 und früher lautet das Middleware-Schlüsselwort: MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = ('zqxt.middleware.BlockedIpMiddleware',
    ...其它的中间件
)
Nach dem Login kopieren

3 von Methoden in der Middleware

1. Normale Situation

 1 from django.shortcuts import HttpResponse 2 from django.utils.deprecation import MiddlewareMixin 3 class M1(MiddlewareMixin): 4     def process_request(self, request): 5         print('m1.request') 6         # return HttpResponse('request_m1') 7  8     def process_view(self, request, callback, callback_args, callback_kwargs): 9         print('m1.view')10         # response = callback(request, *callback_args, **callback_kwargs)11         # return response12 13     def process_response(self, request, response):14         print('m1.response')15         return response16 17     def process_exception(self, request, exception):18         print('m1.process_exception')19         return HttpResponse('m1.process_exception')20 21     def process_template_response(self, request, response):22         """23         视图函数的返回值中,如果有render方法,才被调用24         :param request:25         :param response:26         :return:27         """28         print('m1.process_template_response')29         return response30 31 32 class M2(MiddlewareMixin):33     def process_request(self, request):34         print('m2.request')35 36     def process_view(self, request, callback, callback_args, callback_kwargs):37         print('m2.view')38         # response = callback(request, *callback_args, **callback_kwargs)39         # return response40 41     def process_response(self, request, response):42         print('m2.response')43         return response44 45     def process_exception(self, request, exception):46         print('m2.process_exception')47         return HttpResponse('m2.process_exception')48 49     def process_template_response(self, request, response):50         """51         视图函数的返回值中,如果有render方法,才被调用52         :param request:53         :param response:54         :return:55         """56         print('m2.process_template_response')57         return response
Nach dem Login kopieren
process_request und process_view geben Keine zurück

Ausführungsreihenfolge:

  1. m1.request

  2. m2.request

  3. m1.view

  4. m2.view

  5. m2.response

  6. m1-Antwort

2. In Version 1.10 und höher

Wenn „process_request“ ein HttpResponse-Objekt zurückgibt, kehren Sie vom „process_response“ der aktuellen Middleware zurück

 1 from django.shortcuts import HttpResponse 2 from django.utils.deprecation import MiddlewareMixin 3 class M1(MiddlewareMixin): 4     def process_request(self, request): 5         print('m1.request') 6         return HttpResponse('request_m1') 7  8     def process_view(self, request, callback, callback_args, callback_kwargs): 9         print('m1.view')10         # response = callback(request, *callback_args, **callback_kwargs)11         # return response12 13     def process_response(self, request, response):14         print('m1.response')15         return response16 17     def process_exception(self, request, exception):18         print('m1.process_exception')19         return HttpResponse('m1.process_exception')20 21     def process_template_response(self, request, response):22         """23         视图函数的返回值中,如果有render方法,才被调用24         :param request:25         :param response:26         :return:27         """28         print('m1.process_template_response')29         return response30 31 32 class M2(MiddlewareMixin):33     def process_request(self, request):34         print('m2.request')35 36     def process_view(self, request, callback, callback_args, callback_kwargs):37         print('m2.view')38         # response = callback(request, *callback_args, **callback_kwargs)39         # return response40 41     def process_response(self, request, response):42         print('m2.response')43         return response44 45     def process_exception(self, request, exception):46         print('m2.process_exception')47         return HttpResponse('m2.process_exception')48 49     def process_template_response(self, request, response):50         """51         视图函数的返回值中,如果有render方法,才被调用52         :param request:53         :param response:54         :return:55         """56         print('m2.process_template_response')57         return response58 59 60 # class RequestExeute(object):61 #     def process_request(self, request):62 #         print('process_request')63 #64 #     def process_view(self, request, callback, callback_args, callback_kwargs):65 #         print('process_view')66 #67 #     def process_exception(self, request, exception):68 #         """69 #         当views函数出错时执行70 #         :param request:71 #         :param exception:72 #         :return:73 #         """74 #         print('process_exception')75 #76 #     def process_response(self, request, response):77 #         """78 #         必须return HttpResponse79 #         :param request:80 #         :param response:81 #         :return:82 #         """83 #         print('process_response')84 #         return response85 #86 #     def process_template_response(self, request, response):87 #         """88 #         视图函数的返回值中,如果有render方法,才被调用89 #         :param request:90 #         :param response:91 #         :return:92 #         """93 #         print('process_template_response')94 #         return response
Nach dem Login kopieren
Process_request von M1 gibt HttpResponse zurück

Ausführungsreihenfolge:

  1. m1.request

  2. m1.response

process_view ähnelt Process_request:

 1 from django.shortcuts import HttpResponse 2 
 from django.utils.deprecation import MiddlewareMixin 3 class M1(MiddlewareMixin): 4     
 def process_request(self, request): 5         
 print('m1.request') 6         
 # return HttpResponse('request_m1') 7  8     
 def process_view(self, request, callback, callback_args, callback_kwargs): 9         
 print('m1.view')10         response = callback(request, *callback_args, **callback_kwargs)11         
 return response12 13     def process_response(self, request, response):14         print('m1.response')15         
 return response16 17     def process_exception(self, request, exception):18         
 print('m1.process_exception')19         
 return HttpResponse('m1.process_exception')20 21     def process_template_response(self, request, response):22         """23         视图函数的返回值中,如果有render方法,才被调用24         :param request:25         :param response:26         :return:27         """28         print('m1.process_template_response')29         return response30 31 32 class M2(MiddlewareMixin):33     def process_request(self, request):34         print('m2.request')35 36     def process_view(self, request, callback, callback_args, callback_kwargs):37         print('m2.view')38         # response = callback(request, *callback_args, **callback_kwargs)39         # return response40 41     def process_response(self, request, response):42         print('m2.response')43         return response44 45     def process_exception(self, request, exception):46         print('m2.process_exception')47         return HttpResponse('m2.process_exception')48 49     def process_template_response(self, request, response):50         """51         视图函数的返回值中,如果有render方法,才被调用52         :param request:53         :param response:54         :return:55         """56         print('m2.process_template_response')57         return response
Nach dem Login kopieren
m1's Process_view gibt HttpResponse zurück

Ausführungsreihenfolge:

  1. m1.request
    m2.request
    m1.view
    m2.response
    m1.respons
    Nach dem Login kopieren

3. Vor Version 1.10

Wenn Process_request gibt ein HttpResponse-Objekt zurück, die Process_request nach der aktuellen Middleware wird nicht ausgeführt und die Process_response der letzten Middleware wird nach vorne zurückgegeben

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Django-Middleware. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage