devops——6、django基础URL

一、URL路由

对于高质量的Web 应用来说,使用简洁、优雅的URL路由是一个非常值得重视的细节。Django 让你随心所欲设计你的URL,不受框架束缚。为了给一个应用设计URL,你需要创建一个Python 模块,通常称为URLconf(URL configuration)。这个模块是纯粹的Python 代码,包含URL 模式(简单的正则表达式)到Python 函数(你的视图)的简单映射。

二、Django 如何处理一个请求

  1. django 加载(manage.py中的) ROOT_URLCONF 指定的模块,并寻找可用的urlpatterns.它是django.conf.urls.url() 实例的一个Python 列表。
  2. Django 依次匹配每个 URL,在与请求的URL 匹配的第一个url停下来
  3. 一旦其中的一个正则表达式匹配上,Django 将导入并调用给出的视图,它是一个简单的Python 函数(或者一个基于类的视图)
  4. 如果没有匹配到正则表达式,或者如果过程中抛出一个异常,Django 将调用一个适当的错误处理视图:handler404, handler500, handler403, handler400

(1)from django.conf.urls import url
URLconf:URLconf是一个python模块,是一个URL模式(简单正则表达式)到Python函数(视图)之间的映射。
urlpatterns:urlpatterns 是一个 url() 实例类型的Python 列表。urlpatterns 中的每个正则表达式在第一次访问它们时被编译。

url函数
url(regex, view, kwargs=None, name=None)

- regex: 一个字符串(原始字符串)或简单的正则表达式
- view: view参数是一个视图函数或as_view()的结果(基于类的视图)
- kwargs: 传递额外的参数给视图
- name: url名称

(2)from django.conf.urls import include

Include语法
include(module, namespace=None, app_name=None)
include(pattern_list)
include((pattern_list, app_namespace), namespace=None)
include((pattern_list, app_namespace, instance_namespace))

- module: URLconf模块
- namespace:URL命名空间
- app_name: app的命名空间
- pattern_list: 可迭代的django.conf.urls.url()实例
- app_namespace: 应用的命名空间
- instance_namespace: 实例的命名空间

include 示例

urlpatterns = [
      url( r'^$', RedirectView.as_view(url="/dashboard/")),
      url(r'^dashboard/', include("dashboard.urls")),
      url(r'^accounts/', include("accounts.urls")),
      url(r'^admin/', admin.site.urls),
]

 urlpatterns = [
      url(r"^user/", include([
          url(r'^list/$', view.userlist, name="user_list"), 
          url(r'^info/$', view.userinfo, name="userer_inf),
          url(r'^modify/', include([
             url(r'status/$',view.modifystatus, name="user_modify_status"),
          ]))
      ]))
]

表示访问路径:/user/list /user/info /user/modify/status

三、url参数——位置参数

若要从URL 中捕获一个值,只需要在它周围放置一对圆括号

devops/dashboard/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
      #url(r'^articles/2019/$', views.special_case_2019),
      url(r'^articles/([0-9]{4})/$', views.year_archive),
      url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
      url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

视图

devops/dashboard/views.py
from django.http import HttpResponse
import json
# def special_case_2019(request):
#     return HttpResponse("article 2019")

def year_archive(request, *args, **kwargs):
    return HttpResponse(json.dumps(args))

def month_archive(request, *args, **kwargs):
    return HttpResponse(json.dumps(args))

def article_detail(request, *args, **kwargs):
    return HttpResponse(json.dumps(args))

请求地址:http://127.0.0.1:8000/dashboard/articles/2019/01/13/
调用函数:views.article_detail(request, “2019”, “01”, “13”)
页面显示:[“2019”, “01”, “13”]

四、url参数——关键字参数

语法:
     (?P<name>pattern)
     
- name是传给视图参数的名字,
- pattern是一个正则表达式,也是关键字参数的值

url参数——关键字参数示例

devops/dashboard/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^articles/2019/$', views.special_case_2019),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$‘, views.article_detail),
]

视图

devops/dashboard/views.py
from django.http import HttpResponse
import json
# def special_case_2019(request):
#     return HttpResponse("article 2019")

def year_archive(request, *args, **kwargs):
    return HttpResponse(json.dumps(kwargs))

def month_archive(request, *args, **kwargs):
    return HttpResponse(json.dumps(kwargs))

def article_detail(request, *args, **kwargs):
    return HttpResponse(json.dumps(kwargs))

请求地址:http://127.0.0.1:8000/dashboard/articles/2019/01/13/
调用函数:views.article_detail(request, year=‘2019’, month=‘01’, day=‘13’).
页面显示:{“year”: “2019”, “month”: “01”, “day”: “13”}

五、url参数——额外参数

URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数
django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数

devops/dashboard/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'name': 'blog'}),
]

请求地址:http://127.0.0.1:8000/dashboard/blog/2019/01/
调用函数:views.year_archive(request, year=‘2019’,name=‘blog’)
页面显示:{“year”: “2019”, “month”: “01”, “name”: “blog”}

六、URL反向解析(了解)

django给每个URL取了一个名字,存储每个URL与name的映射关系
根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。这种方式叫做反向解析URL、反向URL匹配、反向URL查询或者简单的URL反查。

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
]

URL反向解析示例:
视图中使用:

from django.core.urlresolvers import reverse
year = 2019
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

模板中使用:

<a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值