ldq1996
\'\'\'
# 1. 通过ChangeList封装好多数据
# 2. 销售中公共资源:Q查询,3天 15天
    from django.db.models import F,Q
    F 使用查询条件的值,专门取对象中某列值的操作
    models.User.objects.update(age=F(\'age\')+1)
    Q对象常用于实现搜索功能,常配合双下划綫查询使用
    | is or, & is and ~ 表示否定
    q1=models.Book.objects.filter(Q(title__startswith=\'P\')).all()
    Q对象组合使用可以产生一个新对象
    Q(title__startswith=\'P\') | ~Q(pub_date__year=2005)

    Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
     Book.objects.get(
            Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
            title__startswith=\'P\')
# 3. 使用yield实现
#     - 生成器函数,对数据进行加工处理
#     - __iter__和yield配合
# 4. 获取Model类中的字段对from django.db.models import F应的对象
#     class Foo(model.Model):
#         xx = models.CharField()
#
#     Foo.get_field(\'xx\')
#
# 5. 模糊搜索功能
#   使用Q方法
# 6. Type创建类
#   type时所有元类的父亲
    object是type(object的类型是type),type也是object(type继承自object)
    >>> isinstance(object, type)
    True
    >>> isinstance(type, object)
    True
    在python中一切皆object,所有对象都是从object继承而来的,type也是object,而object的type是type
    >>> type.__base__
    <type \'object\'>
    >>> type(object)
    <type \'type\'>


    1、type是一切type的类型
    2、object是所有对象的基类,type也继承自object
    3、object的type是type



    去掉object所有对象都不能用了,而去掉type,所有对象还是可以正常运作的,只是没有一个东西标识他的类型了
# 7. 自动派单
#     - 原来在内存中实现,问题:重启和多进程时,都有问题。
#     - redis
#         - 状态
#         - 原来数据(权重表 权重和个数)
#         - pop数据
# 8. 使用 list_diplay配置
#     list_display = [函数名,]
#
# 9. reverse反向生成URL
    #使用方法:
    def index(request):
    from django.urls import reverse
    test_url = reverse(\'xx\')
    print(test_url)
    return HttpResponse("进入index")

    def text(requext):
        return HttpResponse("进入text")

    urlpatterns = [
        url(r\'^index/\', index,),
        url(r\'^text/dasd/asd/asd/sad/asd/as/d\', text,name=\'xx\'),
    ]
# 10. 模板
#   为了减少重复代码而使用模板
    命名为base.html,这个页面主要放公用部分的代码,各个子页面都可以继承这个页面的样式。
    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>{% block title %}首页{% endblock %}</title>
       {% block js %} {% endblock %}
       {% block css %}  {% endblock %}
    </head>
    <body>
       {% block content %}{% endblock %}
    </body>
    </html>

    如下所示,{% extends ‘base.html’ %}作为基础模板,必须放在第一行才可以识别。
    {% block %}这个标签,告诉模板引擎,子模板可以重载这些
    {% include %}允许模板中包含其他模板。
    注意css和js等静态文件,是和html不同的识别方式。
    {% extends \'base.html\' %}

    <!-- 该页面不允许出现js以及css代码,content代码可直接写在本文件中,下面只是content的实例代码 -->
    {% block title %}
       <!-- 此处写页面标题 -->
    {% endblock %}

    {% block js %}
        <!-- 此处填充js链接 -->
        <script type="text/javascript" src="..."></script>
    {% endblock %}

    {% block css %}
        <!-- 此处填充css链接 -->
    {% endblock %}

    {% block content %}
        <!-- 此处填充页面主体内容 -->
        {% include \'taskApp/cjjdglContent.html\' %}
    {% endblock %}
# 11. ready方法定制起始文件
#     - 文件导入实现单例模式
# 12. inclusion_tag
#   一种比较普遍的tag类型是只是渲染其它模块显示下内容,这样的类型叫做Inclusion Tag。
    @register.inclusion_tag(\'link.html\', takes_context=True)
    def jump_link(context):
        return {
            \'link\': context[\'home_link\'],
            \'title\': context[\'home_title\'],
    }
# 13. 中间件的使用
#   什么是 middleware?
    Middlewares 是修改 Django request 或者 response 对象的钩子.

    什么时候使用middleware
    1.多个网页的登录权限认证时
    2.如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。
    3.可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

    Django还有一些默认的middleware比如:
    AuthenticationMiddleware
    还有更多的都可以在shting中配置

    使用middleware时应该记住的东西!
    middleware的顺序非常重要
    一个middleware只需要继承object类
    一个middleware可以实现process_request(方法)

    给两个middleware添加process_request方法
    class AnotherMiddleware(object):
        def process_request(self, request):
            print "Another middleware executed"

        def process_response(self, request, response):
            print "AnotherMiddleware process_response executed"
            return response

    class BookMiddleware(object):
        def process_request(self, request):
            print "Middleware executed"
            print request.user
            return HttpResponse("some response")
            #self._start = time.time()

        def process_response(self, request, response):
            print "BookMiddleware process_response executed"
            return response




# 15. importlib + getattr
    ######setting.py#####
    MESSAGE_CLASSES = [
        \'utils.message.email.Email\',
        \'utils.message.msg.Msg\',
        \'utils.message.wx.WeChat\',
        \'utils.message.dingding.DingDing\',
    ]
    ##.py
    import importlib #动态导入模块
    from django.conf import settings
    for cls_path in settings.MESSAGE_CLASSES:
        # cls_path是字符串
        module_path,class_name = cls_path.rsplit(\'.\',maxsplit=1)
        m = importlib.import_module(module_path)
        obj = getattr(m,class_name)()
        obj.send(subject,body,to,name,)
#
# 16. FilterOption,lambda表达式
    #lanmbda是一个匿名函数
    它可以通过传给reduce中的函数(必须是二元函数)
    依次对数据集中的数据进行操作。
    from functools import reduce
    list=[i for i in range(1,101)]
    a=reduce(lambda x,y:x+y,list)
    print(a)
# 17. QueryDict
#     - 原条件的保留
#     - filter
# 18. ModelForm
    #from django.forms import Form,ModelForm,fields,widgets as wd
    class QueModelForm(ModelForm):
        class Meta:
            model=models.Question  #
            fields=[\'caption\',\'tp\']
            error_messages = {
                \'caption\':{\'required\':\'名称不等为空\',\'invalid\':\'格式错误\'},
                \'tp\':{\'required\':\'名称不等为空\',\'invalid\':\'格式错误\'}
            }
            widgets = {
                \'caption\':wd.TextInput(attrs={\'class\':\'form-control\',}),
                # \'tp\':wd.TextInput(attrs={\'class\':\'form-control\'})
            }

    class UserTypeModeForm(ModelForm):
        title = fields.CharField(max_length=6,required=True,widget=wd.Textarea())

        class Meta:
            model = models.UserType
            fields = "__all__"

            error_messages = {
                \'title\':{\'required\':\'名称不能为空\',\'invalid\':\'格式错误\'}
            }
            widgets = {
                \'title\':wd.TextInput(attrs={\'class\':\'c1\'})
            }

# 19. 面向对象的 @property  @classmethod
    #staticmethod和classmethod的作用:
    一般来说,要使用某个类的方法,需要先实例化一个对象在调用方法。
    而使用@staticmethod或classmethod,就可以不需要实例化,直接类名.方法名来调用。
    这有利于组织代码,把某些应该属于某个类的函数给放到那个类里,同时有利于代码整洁

    区别:
    @staticmethod不需要表示自身对象的self和自身类的cla参数,就跟使用函数一样
    @classmethod也不需要self参数,但第一个参数需要表示自身类的cls参数

    class A():
        cap=\'A\'
        def foo(self):
            print(\'B\')
        @staticmethod
        def static_cap():
            print(\'static\')
            print(A.cap)
            A().foo()
        @classmethod
        def class_foo(cls):
            print(\'class\')
            print(cls.cap)
            cls().foo()

    print(A.cap)
    # A.static_cap()
    # A.class_foo()

    @property:方法调用时不用加括号
# 20. mark_safe
    何谓转义?就是把html语言的关键字过滤掉。例如,<div>就是html的关键字,如果要在html页面上呈现<div>,其源代码就必须是&lt;div&gt;
    PS:转义其实就是把HTML代码给转换成HTML实体了!
    默认情况下,django自动为开发者提供escape功能,即在html代码render之前,先进行转义,然后再呈现出来。
    这样的话,我们如果想输出一个链接,被转义之后,可能就无法得到我们想要的结果。
    1.使用mark_safe函数标记后,django将不再对该函数的内容进行转义
    2.在template中 可以使用 {{ data|safe }}
    3.在自定义模板语法中可以:把is_safe属性设置为Ture
    @register.filter

    def myfilter(value):

        return value

    myfilter.is_safe = True
#
# 21. 抽象方法抽象类+raise Im...
    ##base.py
    #####方法一######
    from abc import ABCMeta
    from abc import abstractmethod

    class BaseMessage(metaclass=ABCMeta):

        @abstractmethod
        def send(self,subject,body,to,name):
            pass

    ########方法二#######
    class BaseMessage(object):
        def send(self, subject, body, to, name):
            raise NotImplementedError(\'未实现send方法\')

    #######dingding.py#########
    from .base import BaseMessage

    class DingDing(BaseMessage):
        def __init__(self):
            pass

        def send(self,subject,body,to,name):
            print(\'钉钉消息发送成功\')
# 22. 组件中的装饰器,实现self.request = request
#
# 23. 自执行函数
#     (function(arg){
#
#
#     })(\'sf\')
#
#
# 24. URL的钩子函数
#
# 25. 多继承
#
# 26. 批量导入,xlrd
    #table = data.sheets()[0]
    table = data.sheet_by_index(0)
    print(table)
    #获取正行或是整列的值
    con = table.row_values(0)#[356.0, \'星际牛仔\', \'カウボーイビバップ\', \'\n                         26话 /  1998年10月23日 / 渡辺信一郎 / 矢立肇 / 川元利浩                    \', 9.1, \'(4021人评分)\']
    con = table.col_values(2)#[\'cname\', \'星际牛仔\', \'攻壳机动队 S.A.C. 2nd GIG\', \'攻壳机动队 STAND ALONE COMPLEX\', \'新世纪福音战士\', ]
    print(con)
    #获取行数与列数
    nrows = table.nrows
    print(nrows)#673
    ncols = table.ncols
    print(ncols)#6

    #循环行列表数据
    # for i in range(nrows):
    #     print(table.row_values(i))

    #循环列列表数据
    for i in range(ncols):
        print(table.col_values(i))
    #单元格索引
    val = table.cell(5,5).value

    # print(val2)
# 27. redis连接池
#   为什么使用Redis连接池?
    首先Redis也是一种数据库,它基于C/S模式,因此如果需要使用必须建立连接,稍微熟悉网络的人应该都清楚地知道为什么需要建立连接,
    C/S模式本身就是一种远程通信的交互模式,因此Redis服务器可以单独作为一个数据库服务器来独立存在。

    import redis
    conn = redis.Redis(host=\'192.168.20.150\',port=6379,password=\'\')
    # conn.set(\'ldq_k1\',\'v1\')
    k1 = conn.get(\'ldq_k1\')
    print(k1)#b\'v1\'
    # conn.rpush(\'ldq_k2\',*[1,2,3,4,5,6])
    k2= conn.rpop(\'ldq_k2\')
    print(k2)
# 28. 工厂模式
#     settings.py
#         MSG_PATH = "path.Email"
#
#
#     class XXFactory(object):
#         @classmethod
#         def get_obj(cls):
#             settings.MSG_PATH
#             # rsplit
#             # importlib
#             # getattr
#             return obj
#
#     class Email(object):
#         def send ...
#
#     class WeChat(object):
#         def send ...
#
#     class Msg(object):
#         def send ...
#
#
# 29. Models类中自定义save方法
    借鉴了admin重写了save方法
    from django.contrib import admin
    class ArticleAdmin(admin.ModelAdmin):
        def save_model(self, request, obj, form, change):
            # 自定义操作
            obj.save()

    defsave(self,*args,**kwargs):
        do_something()
        super(YourModel, self).save(*args,**kwargs)  # Call the "real" save() method.
        do_something_else()
#
# 30. django admin中注册models时候
#     from django.contrib import admin
#
#     from . import models
#
#     # 方式一
#     class UserConfig(admin.ModelAdmin):
#         pass
#
#     admin.site.register(models.UserInfo,UserConfig)
#
#     # 方式二
#     @admin.register(models.UserInfo)
#     class UserConfig(admin.ModelAdmin):
#         pass
#
# 31. 深浅拷贝

\'\'\'

 

分类:

技术点:

相关文章:

  • 2021-06-30
  • 2021-08-08
  • 2021-12-15
  • 2021-07-12
  • 2021-10-09
  • 2021-04-28
  • 2021-09-04
  • 2021-07-28
猜你喜欢
  • 2021-10-02
  • 2021-10-09
  • 2021-09-30
  • 2021-11-29
相关资源
相似解决方案