Python笔记_47_Django路由层_视图层

路由层(URLconf)

路由层简单配置

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。
在这里插入图片描述

Django2 用path Django1用url

在这里插入图片描述

path方法

写固定的url.

在这里插入图片描述
注意后面必须有/
在这里插入图片描述
浏览器输入url:
在这里插入图片描述

re_path方法

可以使用正则规则

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/2003/', views.special_case_2003),
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$', views.article_detail),
]
path和url的区别:
path 内部封装好了,自动限制首尾的规则
url 没有封装,需要自己手动添加正则规则(同 re_path方法).

注意:

  • 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
  • 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles而不是 ^/articles
  • 每个正则表达式前面的r是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
无名分组(按位置传参)

re_path方法,在url里用小括号进行分组(括号里写上正则的规则).
在这里插入图片描述
注意:在视图函数里要写上对应的形参,否则会报错.
在这里插入图片描述

有名分组(按关键字传参)

用re_path方法,在url里用小括号进行分组(括号里写上正则的规则).

语法:括号里(?P<关键字名称>正则规则)
在这里插入图片描述
在视图里形参必须要跟关键字名称保持一致,位置没有关系.
在这里插入图片描述

反向解析

在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
好处: 当你url发生改变,动态反向解析出对应的url.便于开发和维护.

使用的步骤:

  • urls.py定义name

    path('login1/', views.login, name="login"),
    
  • views.py视图中反向解析

    from django.urls import reverse
    
    reverse("login")
    
    #无名分组
    #re_path(r'^login1/([0-9]{2})/$', views.login, name="login"),
    reverse("login", args=("12",))
    
    #有名分组
    #re_path(r'^login1/(?P<month>[0-9]{2})/$', views.login, name="login"),
    reverse("login", kwargs={"month": "12"})
    
  • 在模板login.html中使用反向解析

    path方法(url)
    <form action="{% url 'login' %}" method="post">
        
    re_path(无名分组)
    <form action="{% url 'login' 12 %}" method="post">
        
    re_path(有名分组)
    <form action="{% url 'login' month=12 %}" method="post">
    
名称空间

命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。
我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间

  • 定义名称空间
    project的urls.py

    path('app01/', include(("app01.urls", "app01"))),
    path('app02/', include(("app02.urls", "app02"))),
    
    # 在conf.py源码的44行 
    # namespace = namespace or app_name
    
  • 使用名称空间
    app01.urls

    urlpatterns = [
        re_path(r'^index/', index,name="index"),
    ]
    

    app02.urls

    urlpatterns = [
        re_path(r'^index/', index,name="index"),
    ]
    

    app01.views

    from django.core.urlresolvers import reverse
    
    def index(request):
    
        return  HttpResponse(reverse("app01:index"))
    

    app02.views

    from django.core.urlresolvers import reverse
    
    
    def index(request):
        return  HttpResponse(reverse("app02:index"))
    

    在模板中也是同理

    <form action="{% url 'app01:Login' %}" method="post">
        <p>用户名:<input type="text" name="user"></p>
        <p>密码:<input type="password" name="pwd"></p>
        <input type="submit">
    </form>
    

视图层

一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。
视图层,熟练掌握两个对象即可:请求对象(request)和响应对象(HttpResponse):

HttpRequest对象
request属性

django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。

  • HttpRequest.GET
    一个类似于字典的对象,包含 HTTP GET 的所有参数。GET QueryDict 响应头的内容(url后的参数)

    • 获取一个值request.GET.get("name") # 参数同名时返回最后一个
    • 获取多个值request .GET.getlist("name") # 返回值为list
  • HttpRequest.POST
      一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。POST QueryDict 响应体里的内容。

    注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
    request.POST.getlist("hobby")

  • HttpRequest.body
      原生请求体的内容:一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
      但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST

  • HttpRequest.path
    返回当前请求的路径(url)(不含域名)

    例:"/music/bands/the_beatles/"

  • HttpRequest.method
    返回当前请求的请求方式:一个字符串,表示请求使用的HTTP 方法。必须使用大写。

    例如:“GET”、“POST”

request常用方法
  • HttpRequest.get_full_path()
    获取当前请求的完整路径(包含参数,不包含锚点)

    例如:"/music/bands/the_beatles/?print=true"

  • HttpRequest.is_ajax()
    如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串’XMLHttpRequest’。
    判断当前请求是否是ajax请求.返回值为布尔值

HTTPResponse对象(响应三剑客)
响应对象主要有三种形式(响应三剑客):
HttpResponse()
render()
redirect()
  • HTTPResponse
    直接返回字符串,响应体里面的内容

  • render
    render(request, template_name[, context])
    结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象(模板文件)
    第一个参数 request
    第二个参数 模板文件(login.html)
    第三个参数(可选) 模板需要渲染的值.

  • redirect
    重定向

    def my_view(request):
     ...
     	return redirect('/some/url/')
    

    也可以是一个完整的URL

    def my_view(request):
    ...
    	return redirect('http://example.com/') 
    

    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值