zoukankan      html  css  js  c++  java
  • <玩转Django2.0>读书笔记:URL规则和视图

    1. 带变量的URL

    #urls.py
    from django.urls import path
    from .view import *
    
    urlpatterns = [
        path('',index_views),
        #添加带有整数的字符类型、整形和slug的URL
        path('<year>/<int:month>/<slug>',mydate_views),
    ]
    

    URL变量类型:

    • 字符类型 : 默认类型,匹配任何非空字符串,但不含'/'
    • int : 整型
    • slug : 可理解为注释、后缀或附属等概念
    • uuid : 匹配一个uuid格式对象.为防止冲突,规定必须使用破折号并且所有字母小写
    from django.urls import re_path
    from .views import *
    
    urlpatterns = [
        path('',index_views),
        re_path('test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})',mydate_views),
    ]
    

    使用正则表达式写法:

    • ?P 是固定格式
    • 为变量的编写规则
    • [0-9]{4} 是正则表达式

    2. 响应类型

    视图函数return的响应类型

    响应类型 说明
    HttpResponse('Hello World') HTTP状态码200,请求已成功被服务器接收
    HttpResponseRedirect('/admin/') HTTP状态码302,重定向Admin站点的URL
    HttpResponsePermanentRedirect('/admin/') HTTP状态码301,永久重定向Admin站点的URL
    HttpResponseBadRequest('BadRequest') HTTP状态码400,访问的页面不存在或者请求错误
    HttpResponseNotFound('NotFound') HTTP状态码404,网页不存在或网页的URL失效
    HttpResponseForbidden('NotFound') HTTP状态码403,没有访问权限
    HttpResponseNotAllowed('NotAllowed') HTTP状态码405,不允许使用该请求方式
    HttpResponseServerError('ServerError') HTTP状态码500,服务器内容错误

    响应类型代表HTTP状态码,其核心作用是Web Server服务器用来告诉客户端当前网页请求发生了事,或者当前Web服务器的响应状态

    3. 文件下载

    def download_views(request):
        # 定义HttpResponse的响应类型为文件(text/csv),生成resp对象
        resp = HttpResponse(content_type="text/csv")
        
        # attachment设置文件下载方式,filename为文件名
        resp['Content-Disposition'] = 'attachment;filename="somefilename.csv"'
    
        # 使用csv模块加载resp对象,把数据写入resp对象所设置的csv文件
        writer = csv.writer(resp)
        writer.writerow(['First row','A','B','C'])
        return resp
    

    也可以使用StreamingHttpResponseFileResponse实现下载,推荐使用FileResponse

    def download_views2(request):
        file = open('/home/tarena/简言.jpg','rb')
        resp = FileResponse(file)
        resp['Content-Type']='image/jpeg'
        resp['Content-Disposition'] = 'attachment;filename="简言.jpg"'
        return resp
    

    关于文件下载类型,参考地址:
    http://tool.oschina.net/commons

    4. render(),redirect()函数

    Django在django.http模块上进行封装.从而有了render(),redirect()函数

    render()函数参数:

    • request : 浏览器向服务器发送的请求对象,必须参数
    • template_name : HTML模板文件名,用于生成HTML网页,必须参数
    • context : 对HTML模板变量赋值,以字典格式表示,默认为空字典
    • status : HTTP状态码,默认为200
    • using : 设置HTML模板转换成HTML网页的模板引擎

    5. request常用属性

    属性 说明 实例
    COOKIES 获取客户端Cookie信息 data = request.COOKIES
    FILES 字典对象,包含所有的上传文件.该字典有三个键:filename为上传文件名;content-type为上传文件的类型;content为上传文件内容 file = request.FILES
    GET 获取GET请求的请求参数,以字典形式存储 request.GET.get('name')
    META 获取客户端的请求头信息,以字典形式存储 request.META.get('REMOTE_ADDR') #获取客户端的IP地址
    method 获取该请求的请求方式(GET或POST) data = request.method
    path 获取当前请求的URL地址 path = request.path
    user 获取当前请求的用户信息 name = request.user.username

    6. 通用视图

    Django植入了通用视图这一功能,该功能封装了视图开发常用的代码和模式
    通用视图通过定义和声明类的形式实现的,根据用途划分为三大类:

    • TemplateView 直接返回HTML模板,但无法将数据库的数据展示出来
    • ListView 将数据库的数据传递给HTML,通常获取某个表的所有数据
    • DetailView 将数据库的数据传递给HTML模板,通常获取数据表的单条数据
    # urls.py
    ...
    path('index/',ProductList.as_view())
    ...
    
    # views.py
    from django.views.generic import ListView
    
    # 通用视图
    class ProductList(ListView):
        # 设置HTML模板的变量名称
        context_object_name = "type_list"
        
        # 设定HTML模板
        template_name = "index.html"
    
        # 查询数据
        queryset = Product.objects.values('ttype').distinct()
    
        # 重写 get_queryset 方法,对模型 Product 进行数据筛选
        # def get_queryset(self):
        #     type_list =  Product.objects.values('ttype').distinct()
        #     return type_list
        
        # 添加其他变量
        def get_context_data(self,**kwargs):
            context = super().get_context_data(**kwargs)
            context['name_list'] = Product.objects.values('name','ttype')
            return context
    

    通用视图还可以获取URL的参数和请求信息

    # urls.py
    ...
    path('index/<id>',ProductList.as_view(),{"name":"小米9"})
    ...
    
    ...
    def get_queryset(self):    
        # 获取URL的变量id
        print(self.kwargs['id'])
        # 获取URL参数name
        print(self.kwargs['name'])
        # 获取请求方式
        print(self.request.method)
    
        type_list =  Product.objects.values('ttype').distinct()
        return type_list
    ...
    
  • 相关阅读:
    Spring MVC- 表单提交
    Ajax提交与传统表单提交的区别说明
    CSS各种居中方法
    Android RecyclerView 使用完全解析 体验艺术般的控件
    如何解决VMware上MAC虚拟机不能上网问题
    input标签的hidden属性的应用及作用
    SpringMVC表单标签简介
    EL显示List里嵌套map(Spring MVC3)返回的model
    Spring3 MVC请求参数获取的几种方法
    写数据到文件,并同步到磁盘
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10542302.html
Copyright © 2011-2022 走看看