·ÖÏíweb¿ª·¢ÖªÊ¶

×¢²á/µÇ¼|×î½ü·¢²¼|½ñÈÕÍÆ¼ö

Ö÷Ò³ ITÖªÊ¶ÍøÒ³¼¼ÊõÈí¼þ¿ª·¢Ç°¶Ë¿ª·¢´úÂë±à³ÌÔËӪά»¤¼¼Êõ·ÖÏí½Ì³Ì°¸Àý
µ±Ç°Î»ÖãºÊ×Ò³ > IT֪ʶ

Djangoѧϰ֮ʮһ£ºÕæÕýÀí½âDjangoµÄ·ÓÉ·Ö·¢ºÍ·´½âurlÔ­Àí

·¢²¼Ê±¼ä£º2023-09-06 02:32ÔðÈα༭£ºËÕСǿ¹Ø¼ü´Ê£ºurl

Ŀ¼

  • URL Dispatcher
    • ¼ò½é
    • ģʽ¸ÅÄî
    • ¶Ô±ÈURLPattern Óë URLResolver (¶à̬µÄÌåÏÖ)
    • ¹¹½¨×Ó·Óɼ¸ÖÖ·½Ê½
    • ·´½âurlËã·¨Âß¼­

URL Dispatcher

¼ò½é

djangoµÄurl dispatcher Éè¼ÆÊÇ»ùÓÚÒ»¸öurl mapperÀ´¹¤×÷µÄ¡£
Õâ¸öurl mapperÖ÷ÒªÓÃÔÚÁ½¸ö·½Ïò£º

  1. url Æ¥Åäµ½ ÊÓͼ
  2. ͨ¹ýÌṩµÄ±êʶ£¬·´½â³ö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 ´æÔÚÕâÑùÒ»¸öÒÀÀµÂß¼­£º

  1. ÌṩÁËapp_name£¬ ¿ÉÒÔ²»Ìṩnamesapce
  2. ÌṩÁËnamespace£¬¾Í±ØÐëÌṩapp_name
  3. Á½Õß¶¼Ìṩ
  4. Á½Õß¶¼²»Ìṩ
    Òâ˼¾ÍÊÇÓÐnamespace±ØÐëÓÐapp_name.
    ΪʲôҪÓÐÕâÑùµÄÂß¼­£¿
    ÒòΪÕâºÍ·´½âurl Ëã·¨Âß¼­Óйء£¿´ÏÂÃæËµÃ÷ÓйØËã·¨Âß¼­<·´½âurlËã·¨Âß¼­>

inlucde()µÄ²ÎÊý·½Ê½£¬Ò²Óм¸ÖÖ£º

  1. include(¡®luffyapi.urls¡®) # app_name ¿ÉÄÜÀ´×Ô¡®luffyapi.urls.app_name¡® £¬ÕâÀïûÌṩnamespace£¬ËùÒÔ¡®luffyapi.urls¡®Öв»ÄÜÓÐapp_name.¡®
  2. include((¡®luffyapi.urls¡®, ¡®luffyapi¡®)) # app_name ¿ÉÄܱ»¡®luffyapi.urls.app_name¡® ¸²¸Ç
  3. include((¡®luffyapi.urls¡®, ¡®luffyapi¡®), namespace=¡®luffyapiuser¡®£©
  4. include(¡®luffyapi.urls¡®, namespace=¡®luffyapiuser¡®) # ÕâÖÖ·½Ê½ÔÚ¡®luffyapi.urls¡® ÖоͱØÐëÓÐapp_name¡£

·´½âurlËã·¨Âß¼­

²Î¿¼¹Ù·½ÎĵµºÍfrom django.urls import reverse º¯ÊýµÄÔ´Âë¡£´óÖ¿ÉÒÔÕâÑùÀí½â£º

  1. Ê×ÏÈ£¬Èç¹ûreverse»òÕß url tag(in Template file) ÖУ¬Ö»ÊÇÌṩÁË¡®name¡® url¶ÔÏóʵÀý»¯ÊǵÄname²ÎÊý£¬ÄÇô·´½âÂß¼­ºÜ¼òµ¥.Ö±½ÓÑ­»·Ò»¸ö¼Ç¼×ÖµäÖÐÕÒµ½¡£¶ÔÓÚnameÏàͬµÄ£¬Ö»»áÈ¡³öÔÚurlpatternÁбíÖÐ×îºóÒ»¸ö¡£
  2. Èç¹û£¬ÌṩµÄ·´½âÃû×ÖÊÇ¡®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

ÖªÊ¶ÍÆ¼ö

Îҵıà³ÌÑ§Ï°Íø¡ª¡ª·ÖÏíwebǰ¶Ëºó¶Ë¿ª·¢¼¼Êõ֪ʶ¡£ À¬»øÐÅÏ¢´¦ÀíÓÊÏä tousu563@163.com ÍøÕ¾µØÍ¼
icp±¸°¸ºÅ ÃöICP±¸2023006418ºÅ-8 ²»Á¼ÐÅÏ¢¾Ù±¨Æ½Ì¨ »¥ÁªÍø°²È«¹ÜÀí±¸°¸ Copyright 2023 www.wodecom.cn All Rights Reserved