Ŀ¼
- URL Dispatcher
- ¼ò½é
- ģʽ¸ÅÄî
- ¶Ô±ÈURLPattern Óë URLResolver (¶à̬µÄÌåÏÖ)
- ¹¹½¨×Ó·Óɼ¸ÖÖ·½Ê½
- ·´½âurlËã·¨Âß¼
URL Dispatcher
¼ò½é
djangoµÄurl dispatcher Éè¼ÆÊÇ»ùÓÚÒ»¸öurl mapperÀ´¹¤×÷µÄ¡£
Õâ¸öurl mapperÖ÷ÒªÓÃÔÚÁ½¸ö·½Ïò£º
- url Æ¥Åäµ½ ÊÓͼ
ͨ¹ýÌṩµÄ±êʶ£¬·´½â³öurl
Django provides a solution such that the URL mapper is the only repository of the URL design. You feed it with your URLconf and then it can be used in both directions:
** Starting with a URL requested by the user/browser, it calls the right Django view providing any arguments it might need with their values as extracted from the URL.
** Starting with the identification of the corresponding Django view plus the values of arguments that would be passed to it, obtain the associated URL.
ģʽ¸ÅÄî
DjangoµÄURL ģʽ·Ç³£µÄÇåÎúºÍÓÅÑÅ¡£Ò»¸ö¸ßÖÊÁ¿µÄwebÓ¦ÓþÍÐèÒªÒ»¸öºÃµÄURLģʽ¡£
DjangoµÄURL Öú¼Çµã£º
- ÒÀÕÕMVCģʽ£¬Í¨¹ýurl ·Ö·¢µ½ ¶ÔÓ¦µÄ viewÊÓͼ
- ½« url ºÍ viewÊÓͼ¶¼·â×°µ½ÁËURLPattern¶ÔÏó£¬Í³³Æurl¶ÔÏó
- url¶ÔÏó·Åµ½urlpatternÁбíÖÐ
- urlpatternÁÐ±íµ¥¶À·ÅÔÚÒ»¸ömoduleÖУ¬ÎÒÃǽÐurl module¡£Ò»°ãÃüÃûÉ϶¼½Ðurls.py
- ÿһ¸ödjangoÏîÄ¿£¬¶¼ÓÐÒ»¸öΨһµÄ½Ðroot_urlconfµÄurl module.Õâ¸öROOT_URLCONFʱ¿ÉÒÔÅäÖõķÅÔÚÏîÄ¿µÄsettings.pyÖС£Ö¸¶¨Ä£¿é·¾¶Ïà¶ÔÓÚÏîÄ¿µÄpython path ·¾¶×Ö·û´®¼´¿É£¬Èç¡®luffyapi.urls¡®
- Ò²¿ÉÒÔͨ¹ýÖмä¼þ¶ÔHTTPRequest¶ÔÏóÌí¼ÓÒ»¸öÊôÐÔ½Ðurlconf,¸³ÖµÖ¸¶¨url module£¬ÕâÑù¾Í»áʹÓÃHttpRequest.urlconf ×÷Ϊroot_urlconf£¬Õë¶Ôµ±Ç°requestµÄÉúÃüÖÜÆÚ¡£
- Öмä¼þ»¹ÊÇʲôʱºò³õʼ»¯¼ÓÔØurl module
- °´×ÅÁбí˳Ðò£¬µÚÒ»¸öÆ¥Åäµ½µÄ¾ÍֹͣƥÅäÁË¡£È»ºóimport and call view
- url¶ÔÏó²»½öÌṩͨ¹ýurlÆ¥ÅäÄõ½view£¬»¹Ìṩͨ¹ýÃû³ÆÄõ½url×Ö·û´®£¬Õâ¾ÍÊÇËùνµÄ·´½âÎöurl¡£·´½âurlÖ÷ÒªÓÃÔÚÖØ¶¨ÏòÏìÓ¦»òÕßhtmlÄ£°åÖС£»¹ÓоÍÊÇmodel object¶¨ÒåÒ»¸öget_absolute_url£¨£©¶ÔÏó·½·¨ÖС£
- url¶ÔÏóÃû³Æ£¬Í¨¹ýurl¶ÔÏóʵÀý»¯²ÎÊýÖÐÖ¸¶¨£¬re_path(r¡®test¡®,test_view, name=¡®testurl¡®)¡®
- »¹ÓÐÒ»¸ö URLResolver¶ÔÏó£¬Õâ¸ö¶ÔÏóÊÇurlpattern¶ÔÏóµÄÈÝÆ÷¡£ÇÒURLResolver¶ÔÏó¿ÉÒÔǶÌ×£¬Ò²¾ÍÊÇURLResolver¶ÔÏó¿´³ÉURLPatternºÍURLResolverµÄÈÝÆ÷£¬ÈÝÆ÷ÖзÅÖÃÒ»¸öURLResolver¶ÔÏ󣬾ÍÊÇ·ÓɵÄǶÌ×£¬Ò²¾ÍÊÇ×Ó·ÓÉ¡£×î¶¥²ãÓÐÒ»¸öURLResolver¶ÔÏ󣬼´¶¥²ãÈÝÆ÷¡£
- ÎÞÂÛURLPattern¶ÔÏó»¹ÊÇURLResolver¶ÔÏ󣬶¼ÊÇͨ¹ýre_path()»òÕßpath()µÃµ½µÄ¡£
- ΪÁËÌṩЧÂÊÇв»ÀË·ÑÄÚ´æ¿Õ¼ä£¬Ã¿¸öURLPatternµÄurlÕýÔò±í´ïʽ¶¼ÊǵÚÒ»´Î·ÃÎÊʱ²Å»á±àÒ루pythonÖÐÓÐÕýÔò±í´ïʽ¶ÔÏ󣬷ÅÓÚÄÚ´æÖУ©
- ÅжÏʵÀý»¯ÎªURLResolver¶ÔÏó»¹ÊÇURLPattern¶ÔÏ󣬸ù¾Ýre_path()»òÕßpath£¨£©µÄµÚ¶þ¸ö²ÎÊýµÄÀàÐÍ¡£Èç¹ûʱlist»òÕßtupleÔòʵÀý»¯ÎªURLResolver¶ÔÏó¡£Èç¹ûÊÇcallable¾ÍʵÀý»¯ÎªURLPattern¶ÔÏó¡£
- ËùÒÔÀûÓÃ×Ó·ÓÉÀ´¼õÉÙ¹ý¶àurlÏàͬǰ׺µÄÈßÓ࣬ʱ×î¼Ñʵ¼ù¡£¾ÍÔÚÇ°ÃæÒ²Ëù¹ýÁË£¬×Ó·ÓÉÒ²ÊÇÓÐURLResolver¶ÔÏó¡£ËùÒÔҪͨ¹ýre_pathµÈÀ´ÊµÀý»¯³öÒ»¸ö×Ó·ÓÉ£¬¾ÍµÃÍê³ÉÒ»¸ö×Ó·ÓɵĹ¹½¨¹ý³Ì¡£×Ó·Óɹ¹½¨¹ý³Ì¾ßÌå¿´±¾ÎÄÏÂÃæ¡£
- ÏÖÔÚ˵»Øurl¶ÔÏó·´½â»ñÈ¡url×Ö·û´®µÄ¹¦ÄÜ
- ¶Ôurl¶ÔÏó½øÐÐÃüÃû£¬ ÌṩʵÀý»¯Ê±µÄname²ÎÊý
- django-app-namespace, Ô´ÂëÖнРapp_name
- ÓÉÓÚdjangoÏîÄ¿ÖУ¬appʱ¿É²å°Î¿É¸´Óõģ¬ËùÒÔ¶Ôͬһ¸öappµÄ¶à´ÎʹÓ㬾ÍҪͨ¹ý¶ÔÆä½øÐÐÇø±ð£¬ËùÒÔÌá³öÁËapp instanceµÄ¸ÅÄͨ¹ý²»Í¬×Ó·ÓÉ·½Ê½À´Âß¼»®·Öͬһ¸öappµÄ³¡¾°Ï£¬Ìá³öÁËinstance namespace¡£ÔÚÔ´ÂëÖоͽРnamesapce
- ͨ¹ýapp_name ºÍ namespace ¶¼¿ÉÒÔ×÷Ϊ·´½âurlµÄÒ»¸ö²ÎÊý
- ²é¿´from django.urls import reverse µÄÔ´Â룬Àí½âÔõôÀûÓà name/app_name/namespcae·´½â³öurl¶ÔÏóµÄʵ¼Êurl×Ö·û´®µÄ¡£
- ·´½âurl»¹ÒªÌṩargs »òÕßkwargs ²ÎÊý¡£
¶Ô±ÈURLPattern Óë URLResolver (¶à̬µÄÌåÏÖ)
ͨ¹ý¶Ô±ÈÁ½¸öÀàµÄ¶¨Ò壺
¿´µ½£¬urlresolverÒ²ÓÐresovle½âÎö·½·¨¡£Ö»²»¹ýurlresolverµÄ½âÎö»áÔÙÈ¥¼ÓÔØ×Óurl moduleÄ£¿éÖеÄurlpatternsÁÐ±í¡£È»ºóÔÙ¶ÔÁбíÖеĽøÐÐÑ»·Æ¥Åä¹ý³Ì£¬Ò»Ö±Ç¶Ì×ÏÂÈ¥£¬ÖªµÀ×îºóµÄreturnÌø³ö·µ»ØÒ»¸öResolverMatch¶ÔÏó¡£¶øurlpatternµÄresolverÖ±½Ó¾Í·µ»ØResovlerMatch¶ÔÏóÁË¡£Ö»²»¹ýǰÕß»áÓÐÖØÐ¼ÓÔØ»ñÈ¡×Óurl moduleÄ£¿éÀ´»ñÈ¡urlpatternsµÄÂß¼¡£
Á½¸öÀà¶¼ÓÃͬÃûµÄ·½·¨£¬Ö»ÊDZíÏÖ³öÀ´µÄµÄ״̬ÓÐËù²»Í¬¡£Õâ¾ÍÊÇÃæÏò¶ÔÏó¶à̬ÔÚ´úÂëÖеÄÌåÏÖ¡£ÌṩÏàͬµÄ¶ÔÍâ½Ó¿Ú£¬Õ¹ÏÖ³öÀ´µÄ״̬¹ý³ÌÓÐËù²»Í¬£¬×îºó·µ»ØÏàͬµÄ¶ÔÏó¡£
¹¹½¨×Ó·Óɼ¸ÖÖ·½Ê½
×Ó·ÓɳýÁ˼õÉÙ·ÓÉǰ׺µÄÈßÓ࣬»¹¿ÉÒÔÂú×ã¶àÖÖurlǰ׺ʹÓÃͬһappµÄÒµÎñ³¡¾°¡£
·½Ê½Ò»
²ÎÕÕÔ´Â룬´Ó×îlow-levelÔ´Âë²ãÃæµÄ·½Ê½,²ÎÕÕʵÀý»¯³öURLResolver¶ÔÏóµÄÔ´Âë
if isinstance(view, (list, tuple)): ?# ÕâÀïµÄviewÊÇre_path»òpathµÄµÚ¶þ¸ö²ÎÊý ???# For include(...) processing. ???pattern = Pattern(route, is_endpoint=False) ???urlconf_module, app_name, namespace = view ???return URLResolver( ???????pattern, ???????urlconf_module, ???????kwargs, ???????app_name=app_name, ???????namespace=namespace, ???)
´ÓÔ´Âë¿ÉÒÔ¿´³ö£¬Èç¹ûview²ÎÊýÊÇÒ»¸öÁбí»òÔª×éÀàÐÍ£¬ÄÇô½«»áʵÀý»¯³öURLResolver¶ÔÏ󣬲¢ÇÒ¶Ôview²ÎÊýÒªÓÐÇÒÓÐÈý¸öÔªËØ¡£µÚÒ»¸öÔªËØ¿ÉÒÔÊÇ×Ó·ÓɵÄÄ£¿éµÄpython path Ò²¿ÉÒÔÖ±½ÓÊÇ url¶ÔÏóµÄÁÐ±í£¨²é¿´URLResolver.url_patternsÔ´Âë¿ÉÒÔÀí½â£©£»µÚ¶þ¸öÔªËØºÍµÚÈý¸öÔªËØ¶¼¿ÉÒÔ¿Õ£¬Ò²¿ÉÒÔ¶¼ÓУ¬µ«ÊDz»ÄÜÖ»ÓÐnamespaceµ¥¶ÀÓС£
·½Ê½¶þ
djangoÄÚÖõÄfrom django.urls import include ÌṩÉú³ÉµÚÒ»ÖÖ·½Ê½view²ÎÊýµÄº¯Êý
includeÔ´Â룺
def include(arg, namespace=None): ???app_name = None ???if isinstance(arg, tuple): ???????# Callable returning a namespace hint. ???????try: ???????????urlconf_module, app_name = arg ???????except ValueError: ???????????if namespace: ???????????????raise ImproperlyConfigured( ???????????????????¡®Cannot override the namespace for a dynamic module that ¡® ???????????????????¡®provides a namespace.¡® ???????????????) ???????????raise ImproperlyConfigured( ???????????????¡®Passing a %d-tuple to include() is not supported. Pass a ¡® ???????????????¡®2-tuple containing the list of patterns and app_name, and ¡® ???????????????¡®provide the namespace argument to include() instead.¡® % len(arg) ???????????) ???else: ???????# No namespace hint - use manually provided namespace. ???????urlconf_module = arg ???if isinstance(urlconf_module, str): ???????urlconf_module = import_module(urlconf_module) ???patterns = getattr(urlconf_module, ¡®urlpatterns¡®, urlconf_module) ???app_name = getattr(urlconf_module, ¡®app_name¡®, app_name) ???if namespace and not app_name: ???????raise ImproperlyConfigured( ???????????¡®Specifying a namespace in include() without providing an app_name ¡® ???????????¡®is not supported. Set the app_name attribute in the included ¡® ???????????¡®module, or pass a 2-tuple containing the list of patterns and ¡® ???????????¡®app_name instead.¡®, ???????) ???namespace = namespace or app_name ???# Make sure the patterns can be iterated through (without this, some ???# testcases will break). ???if isinstance(patterns, (list, tuple)): ???????for url_pattern in patterns: ???????????pattern = getattr(url_pattern, ¡®pattern¡®, None) ???????????if isinstance(pattern, LocalePrefixPattern): ???????????????raise ImproperlyConfigured( ???????????????????¡®Using i18n_patterns in an included URLconf is not allowed.¡® ???????????????) ???return (urlconf_module, app_name, namespace)
¿ÉÒÔ¿´µ½Ìṩapp_name ¶ø²»ÌṩnamespaceµÄ»°ÊÇ»áÅ׳öÒì³£µÄ¡£
Notice£º¹ØÓÚapp_name Óë namespace ´æÔÚÕâÑùÒ»¸öÒÀÀµÂß¼£º
- ÌṩÁËapp_name£¬ ¿ÉÒÔ²»Ìṩnamesapce
- ÌṩÁËnamespace£¬¾Í±ØÐëÌṩapp_name
- Á½Õß¶¼Ìṩ
- Á½Õß¶¼²»Ìṩ
Òâ˼¾ÍÊÇÓÐnamespace±ØÐëÓÐapp_name.
ΪʲôҪÓÐÕâÑùµÄÂß¼£¿
ÒòΪÕâºÍ·´½âurl Ëã·¨Âß¼Óйء£¿´ÏÂÃæËµÃ÷ÓйØËã·¨Âß¼<·´½âurlËã·¨Âß¼>
inlucde()µÄ²ÎÊý·½Ê½£¬Ò²Óм¸ÖÖ£º
- include(¡®luffyapi.urls¡®) # app_name ¿ÉÄÜÀ´×Ô¡®luffyapi.urls.app_name¡® £¬ÕâÀïûÌṩnamespace£¬ËùÒÔ¡®luffyapi.urls¡®Öв»ÄÜÓÐapp_name.¡®
- include((¡®luffyapi.urls¡®, ¡®luffyapi¡®)) # app_name ¿ÉÄܱ»¡®luffyapi.urls.app_name¡® ¸²¸Ç
- include((¡®luffyapi.urls¡®, ¡®luffyapi¡®), namespace=¡®luffyapiuser¡®£©
- include(¡®luffyapi.urls¡®, namespace=¡®luffyapiuser¡®) # ÕâÖÖ·½Ê½ÔÚ¡®luffyapi.urls¡® ÖоͱØÐëÓÐapp_name¡£
·´½âurlËã·¨Âß¼
²Î¿¼¹Ù·½ÎĵµºÍfrom django.urls import reverse º¯ÊýµÄÔ´Âë¡£´óÖ¿ÉÒÔÕâÑùÀí½â£º
- Ê×ÏÈ£¬Èç¹ûreverse»òÕß url tag(in Template file) ÖУ¬Ö»ÊÇÌṩÁË¡®name¡® url¶ÔÏóʵÀý»¯ÊǵÄname²ÎÊý£¬ÄÇô·´½âÂß¼ºÜ¼òµ¥.Ö±½ÓÑ»·Ò»¸ö¼Ç¼×ÖµäÖÐÕÒµ½¡£¶ÔÓÚnameÏàͬµÄ£¬Ö»»áÈ¡³öÔÚurlpatternÁбíÖÐ×îºóÒ»¸ö¡£
- Èç¹û£¬ÌṩµÄ·´½âÃû×ÖÊÇ¡®namespace:name¡® ÕâÖÖģʽ£¬Âß¼¾Í±äµÃ¸´ÔÓÁË¡£
1.1 Ê×ÏȽ«namespace ×÷Ϊһ¸öapp_name ²éÕÒ£¬»áyield ·µ»ØÕâ¸öapp_name µÄËùÓÐinstanceµÄÁÐ±í¡£
1.2 È»ºódjango»áÕÒѰÓëapp_nameÃû×ÖÏàͬµÄinstance namespace×÷ΪÓÃÓÚ½âÎönameµÄ¶ÔÏ󡣡£
1.3 Èç¹ûûÓУ¬django»áʹÓÃ×îºó²¿ÊðµÄinstance×÷Ϊ½âÎönameµÄ¶ÔÏó¡£
1.4 Èç¹ûÁбíÖÐÒ»¸ö¶¼Ã»Æ¥ÅäÉÏapp_name£¬ÄÇôdjango»áÖ±½Óͨ¹ýinstanc namespaceÈ¥²éÕÒ¡£
1.5 ×îºó£¬Èç¹ûreverse´øÈëÁËcurrent_app ²ÎÊýÖ¸¶¨µ±Ç°µÄapp ,ÄÇô¾ÍʹÓõ±Ç°µÄURLResolverÀ´½âÎöname¡£×îºóÕâÒ»µãÓе㲻ºÃÀí½âÌØ±ðÊÇÔÚʹÓÃreverseÓë url tag ÉÏ¡£
Djangoѧϰ֮ʮһ£ºÕæÕýÀí½âDjangoµÄ·ÓÉ·Ö·¢ºÍ·´½âurlÔÀí
ÔÎĵØÖ·£ºhttps://www.cnblogs.com/ZJiQi/p/10339006.html