day64 Pyhton 框架Django 07

day67

内容回顾

视图

1. CBV

定义

    from django.views import View
    
    class Addpub(View):
        
        def get(self,request):
            self.request
            return response
        
        def post(self,request):
            return response

使用:

from app01 import views

url(r'^add_pub/',views.Addpub.as_view())

2. as_view()的流程:

1. Addpub.as_view()执行   ——》  view函数
2. 请求到来的时候,执行view函数:
   1. Addpub(*。**)——》 self
   2. self.request = request
   3. 执行self.dispatch(request.*args,**kwargs)   ——》   Addpub中有 执行自己的dispatch,没有执行父类的
      1. 判断请求方式  http_method_names = [ 'get','post' ]
         1. 允许:
            通过反射获取到对应请求方式(get/post)对应的方法  ——》 handler
         2. 不允许:
                http_method_not_allowed  —— 》 handler
      2. 执行handler   ——》 返回response响应

3. 加装饰器的方式

from django.utils.decorators import method_decorator

1. 直接加在方法上

    @method_decorator(timer)
    def get(self, request):

1. 加在dispatch方法上

    @method_decorator(timer)
    def dispatch(self, request, *args, **kwargs):
        # start = time.time()
        ret = super().dispatch(request, *args, **kwargs)
        # print('所用时间:{}'.format(time.time() - start))
    
        return ret

1. 加在类上

    @method_decorator(timer, 'post')
    @method_decorator(timer, 'get')
    class AddPublisher(View):

4. request 对象

1. request .method   ——》 请求方式   POST GET
2. request .GET      ——》 url上携带的参数
3. request .POST   ——》  POST请求提交的数据
4. request .body   ——》 请求体
5. request .FILES   ——》 上传的文件
   1. enctype = 'mutlipart/form-data'
   2. POST     {% csrf_token %}
   3. 使用文件对象 chunks()
6. request.path_info    ——》 url路径  不包含IP和端口、参数
7. request.COOKIES
8. request.session
9. request.get_full_path()    ——》 url路径  不包含IP和端口  包含参数
10. request.get_host()       ——》 主机的ip和端口
11. request.is_ajax()         ——》 是否是ajax请求

5. response对象

1. HttpResponse()     ——》 返回字符串   Content-Type = 'text/html'
2. render(request,'HTML文件名',{   })    ——》 返回完整的HTML页面
3. redirect(‘要跳转的地址’)  ——》 重定向    Location :地址 
   1. ret = HttpResponse('')   ret['Location ']  = ' 地址'   
4. JsonRespinse(字典)      JsonRespinse([] ,safe=False )      Content-Type = 'application/json'

路由

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^blog/$', views.blogs),
        # url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog),
        url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog),
    ]

正则

^   $  asd  \d    +   ?   *     .   

分组和命名分组

    url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog),   #  位置参数传参

    url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog),   # 关键字传参

从URL上捕获的参数是字符串

include   —— 路由分发

    urlpatterns = [
        url(r'^app01/', include('app01.urls')),
        # url(r'^app02/', include('app02.urls')),
        # url(r'^', include('app01.urls')),
    ]

    urlpatterns = [
    
        url(r'^publisher/', views.publisher),
        # url(r'^add_publisher/', views.add_publisher),
        url(r'^add_publisher/', views.AddPublisher.as_view()),
        # url(r'^add_publisher/', views.view),
        url(r'^del_publisher/(\d+)/', views.del_publisher),
        url(r'^edit_publisher/', views.edit_publisher),
    
        url(r'^test/', views.test), ] 

今日内容

1. url命名和反向解析

    from django.urls import NoReverseMatch, reverse

普通URL:

命名:

    url(r'^blog/$', views.blogs, name='xxxxx'),

反向解析

视图中:

    reverse('xxxxx')    ——》   ‘/blog/’

模板中:

    {% url 'xxxxx' %}

分组:

命名:

     url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog, name='blog'),

反向解析

视图中:

    reverse('blog',args=('2019','01'))    ——》   ‘/blog/2019/01/’

模板中:

    {% url 'blog' '2018' '12' %}    ——》 /blog/2018/12/

分组:

命名分组:

     url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog, name='blog'),

反向解析

视图中:

    reverse('blog',args=('2019','01'))    ——》   ‘/blog/2019/01/’

    reverse('blog',kwargs={'year':'2018','month':12})    ——》   ‘/blog/2018/12/’

模板中:

    {% url 'blog' '2018' '12' %}    ——》 /blog/2018/12/

    {% url 'blog' year='2018' month='12' %}    ——》 /blog/2018/12/

        {% url 'blog' month='12'  year='2018' %}    ——》 /blog/2018/12/

2. namespace

    url('app01/', include('app01.urls', namespace='app01')),
    url('app02/', include('app02.urls', namespace='app02'))

视图:

    reverse('app01:home')

模板

    {% url 'app01:home' %}

ORM

    类  ——》 表

    对象 ——》 数据行 

    属性 ——》 字段

常用的字段

    AutoField
    IntegerField
    BooleanField
    CharField
    DateTimeField
    DateField
    DecimalField
    FloatField

字段和model的参数

见博客

必知必会13条

见代码

单表的双下划线

    ret = models.Person.objects.filter(pk__gt=100)    # greater than
    ret = models.Person.objects.filter(pk__lt=103)    # less than
    ret = models.Person.objects.filter(pk__gte=100)    # greater than  equal
    ret = models.Person.objects.filter(pk__lte=103)    # less than  equal
    
    ret = models.Person.objects.filter(pk__in=[100,103])
    
    ret = models.Person.objects.filter(pk__gte=100,pk__lte=103)
    ret = models.Person.objects.filter(pk__range=[100,103])
    
    ret = models.Person.objects.filter(name__contains='L')
    ret = models.Person.objects.filter(name__icontains='L')
    
    ret = models.Person.objects.filter(name__startswith='x')
    ret = models.Person.objects.filter(name__istartswith='X')
    
    ret = models.Person.objects.filter(name__endswith='x')
    ret = models.Person.objects.filter(name__iendswith='X')
    
    ret = models.Person.objects.filter(birth__contains='2019-01-24')
    
    ret = models.Person.objects.filter(age__isnull=False)

猜你喜欢

转载自www.cnblogs.com/pythonz/p/10317119.html