super_curd组件技术点总结
1.基于包的导入的方式实现单例模式
# test1.py
class AdminSite(object):
def __init__(self):
self.registry = {}
self.app_name = 'super_curd'
self.namespace = 'super_curd'
def register(self, model_class, stark_config):
if not stark_config:
stark_config = StarkConfig
self.registry[self.model_class] = stark_config[self.model_class]
site = AdminSite()
# test2.py
from test1 import site
site.register(model.UserInfo)
2.django中路由分发的原理
# 一般的
urlpatterns = [
url(r'^test/', views.test)
]
# 路由分发
urlpatterns = [
url(r'^test/', include('app_name.urls'))
]
# include原理:元组里面包含三个参数,[url],app_name,namespace
urlpatterns = [
url(r'^test/', (['这里面放url'], app_name, namespace))
]
3.钩子函数
class StarkConfig(object):
list_display = []
def __init__(self, model_class):
self.model_class = model_class
# 第一种钩子 - 在获取静态字段时,通过一个函数来间接获取,这样就能在获取字段之前进行自定义操作
def get_list_display(self):
return self.list_display
# 第二种钩子 - 组件中包含了很多已经设置好的url,在获取url时,自定义额外的url,
def extral_url(self):
pass
# 第三种钩子函数 - 利用装饰器,在生成url时,将request参数传递到当前类当中
import functools
def wrapper(func):
@functools.wraps(func)
def inner(request, *args, **kwargs):
self.request = request
return func(request, *args, **kwargs)
4.inclusion_tag对change_view功能进行拆分
- 实现方式:在app下新建一个名为templatetags文件夹,在里面新建一个py文件,里面写如下内容
# 具体代码
# stark.py
from template import Library
register = Library()
@register.inclusion_tag('stark/test.html')
def test(request):
pass
5.基于类的封装对chang_view功能进行拆分
- 以前的我们
# 在进行数据的存取时,通常使用[],{}等等,然后通过遍历的方法
data_list = [11,22,33]
for data in data_list:
print(data)
- 现在的我们
# 将数据存到类当中的字段中,这样在取数据时,我们只需要实例化一个对象,然后通过对象.的方式取数据
class Test(object):
def __init__(self, data_list):
self.data_list = data_list
t1 = Test()
t1.data_list
6.基于反射,通过传递进来的字符串动态调用函数
name_list = ['multi_delete', 'multi_init']
class Test(object):
name_list = ['multi_delete', 'multi_init']
def multi_delete(self):
pass
def multi_init(self):
pass
def get_name_list(self):
return self.name_list
def run(self):
name_list = self.get_name_list()
for name in name_list:
getattr(self, name)
7.通过_meta获取模型类的类名小写,以及对应的app名称
model.UserInfo._meta.model_name
model.UserInfo._meta.app_label
8.urlencode - 会将字典转换为字符串的方法
- 在python中有两种方式可以使用urlencode方法
# 第一种
from urllib.path import urlencode
# 第二种
from django.http import QueryDict
# 在django的请求中的QueryDict中
request.GET.urlencode # QueryDict中的数据会以`x1=1&x2=3&x3=5`的形式转换
request.POST.urlencode
9.make_safe
- 在后端我们想往前端传递含有前端格式的数据时,我们想让页面去渲染出我们的想要的效果
- 前端为什么不会直接渲染我们传递的字符串类型的前端代码,因为前端这样做事为了预防网站被恶意的进行xss攻击
- xss攻击 - 例子:我们在博客评论时,直接评论一段js代码,如果网站没有xss防护,那么网站就会执行这段js代码,我们就可以利用这个对网站进行恶意破坏,让网站无线弹窗之类的
10.autodiscover_module - 这个方法存在于django的admin源码当中
# 只要我们在某一个app下的apps.py中AppnameConfig类中实现这样一个方法,那么django每次启动之前,都会去app中找对应的py文件,然后将它运行
class StarkConfig(AppConfig):
name = 'stark'
def ready(self):
from django.utils.module_loading import autodiscover_modules
# 当程序启动时,去每个app目录下找stark.py并加载。
autodiscover_modules('stark')
11.基于类的继承,订制自己的config类,
- 当功能不能满足我们的需求时,我们可以继承原来的类,然后重写相关的方法对功能进行扩展
12.保留原来的筛选条件
- 当我们在页面上分页功能时,如果跳转到下一页,那么我们应该将搜索条件也要加入到下一页的数据中,这样对用户来说更加友好
- 当我们从筛选页面跳转到添加数据页面时,我们把条件一起给到我们跳转的页面。这样添加的页面在返回时,也要带上我们的筛选条件,这样我们就可以回到我们原来的带上筛选条件页面上。
- 基于QueryDict、urlencode来实现
13.深浅拷贝
- 在对QueryDict进行修改时,我们希望我们只修改自己的数据,保存到自己创建的一份QueryDict中,这时候就要用到深拷贝,这样做是为了不影响其他人使用QueryDict
14.QueryDict
在HttpRequest对象中,GET和POST属性都是一个django.http.QueryDict的实例。也就是说你可以按本文下面提供的方法操作request.POST和request.GET。
request.POST或request.GET的QueryDict都是不可变,只读的。如果要修改它,需要使用QueryDict.copy()方法,获取它的一个拷贝,然后在这个拷贝上进行修改操作。
15.yield
- 在大量的数据需要我们去传递时,我们可以一点一点的将数据传递出去,这样我们的内存当中存在的数据就不会过多,从而提升服务器的性能
16.Q对象
- 在django中,默认的filter并不能处理or这种情况,一旦我们需要构造复杂一点的查询语句时,就需要用到Q对象。
- 在Q对象中我们可以用or来包含and
con = Q()
con.connector = "OR"
if q:
for field in search_list:
con.children.append(('%s__contains' % field, q))
17.可迭代对象
- 什么是可迭代对象
- 实现了__inter__方法的对象就叫做可迭代对象。
- __inter__方法的作用就是返回一个迭代器对象。直观理解就是能用for循环进行迭代的对象就是可迭代对象。比如:字符串,列表,元祖,字典,集合等等,都是可迭代对象。
18.orm查询 - left join(左表查询) - inner join(内连接)
model.UserInfo.object.filter(id='lucas') -- inner join
model.UserInfo.object.filter(permission__is_null=Ture).values('id', 'title') -- left join
super_curd组件技术点总结的更多相关文章
- .Net 组件技术概述
1. 基本原理 组件是组件系统中功能的表现,没有组件就没有功能.特定接口是用于给组件管理程序来操纵.管理该组件,特定功能是组件需要完成的任务.在一个使用组件建立的产品中会随着功能数目的多少而会有多个组 ...
- vue项目实现按需加载的3种方式:vue异步组件技术、es提案的import()、webpack提供的require.ensure()
1. vue异步组件技术 vue-router配置路由,使用vue的异步组件技术,可以实现按需加载. 但是,这种情况下一个组件生成一个js文件. 举例如下: { path: '/promisedemo ...
- 微信团队分享:iOS版微信的高性能通用key-value组件技术实践
本文来自微信开发团队guoling的技术分享. 1.前言 本文要分享的是iOS版微信内部正在推广和使用的一个高性能通用key-value 组件的技术实践过程,该组件在微信内部被命名为MMKV(以下简称 ...
- 【VS开发】COM组件技术概述
这篇文章对COM做出来比较完整的解释,非常好. COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样功能专一的组件,然后将它 ...
- Java Web编程的主要组件技术——Struts核心组件
参考书籍:<J2EE开源编程精要15讲> Struts配置文件struts-config.xml Struts核心文件,可配置各种组件,包括Form Beans.Actions.Actio ...
- Java Web编程的主要组件技术——Struts入门
参考书籍:<J2EE开源编程精要15讲> Struts是一个开源的Java Web框架,很好地实现了MVC设计模式.通过一个配置文件,把各个层面的应用组件联系起来,使组件在程序层面联系较少 ...
- Java Web编程的主要组件技术——MVC设计模式
参考书籍:<J2EE开源编程精要15讲> MVC(Model View Controller),Model(模型)表示业务逻辑层,View(视图)代表表述层,Controller(控制)表 ...
- COM组件技术名称解释
GUID:全局唯一标识. CLSID 或 ProgID :唯一地表示一个组件服务程序,那么根据这些ID,就可以加载运行组件,并为客户端程序提供服务了. IID :唯一的表示接口ID. COM 组件是运 ...
- Java Web编程的主要组件技术——Hibernate入门
参考书籍:<J2EE开源编程精要15讲> Hibernate是对象/关系映射(ORM,Object/Relational Mapping)的解决方案,就是将Java对象与对象关系映射到关系 ...
随机推荐
- PPT 倒计时时钟,用 GIF 动画实现,可直接使用 -- 附 Python 实现代码
在上课时,有时需要显示一个倒计时时钟,让学生做题. PPT 没有简单有效的方法实现倒计时时钟,参考了多个方案,最终决定采用 GIF 动画来实现. 这样使用起来很简单,只要把事先做好的各个时长的倒计时动 ...
- 网络安全知识--PHP代码审计/Web For Pantesters 的 XSS
用到 ** WEB FOR Pentester** 注意区分单引号双引号. 常见代码 审计工具 wamp,dwva,zvuldrill,burpsuite,seay源代码审计系统... 1 xss W ...
- codeforces 1039B Subway Pursuit【二分+随机】
题目:戳这里 题意:一个点在[1,n]以内,我们可以进行4500次查询,每次查询之后,该点会向左或向右移动0~k步,请在4500次查询以内找到该点. 解题思路:一边二分,一边随机. 交互题似乎有好多是 ...
- linux repo init 遇到的问题
问题描述: 利用repo从远程服务器上取代码时候,出现错误 fatal: cannot make .repo directory:Permission denied, 加了sudo 之后,还是不行, ...
- C# 类 (7) - 抽象 Abstract
Abstract 抽象类,关键字Abstract ,最典型的应用就是在 继承机制里 作为base类,抽象类是不能被实例化的(前面说的static 类也不能被实例化)它必须作为 基类,被别人继承,然后必 ...
- HDU 5608 function(莫比乌斯反演 + 杜教筛)题解
题意: 已知\(N^2-3N+2=\sum_{d|N}f(d)\),求\(\sum_{i=1}^nf(i) \mod 1e9+7\),\(n\leq1e9\) 思路: 杜教筛基础题? 很显然这里已经设 ...
- 实现 MyBatis 流式查询的方法
基本概念流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内存使用.如果没有流式查询,我们想要从数据库取 1000 万条记录而又没有足 ...
- Eclipce怎么恢复误删类
选择误删除文件在eclipse所在包(文件夹) 在包上单击右键. 选择restore from local history... 在弹出的对话框中选择需要恢复的文件
- Linux 驱动框架---input子系统
input 子系统也是作为内核的一个字符设备模块存在的,所以他也是字符设备自然也会有字符设备的文件接口.input子系统的注册过程主要分为两步,先注册了一个input class然后再注册一个字符设备 ...
- npm publish bug & solution
npm publish bug & solution npm ERR! Unexpected token < in JSON at position 0 while parsing ne ...