首页 > 代码库 > django知识点总结
django知识点总结
目录:
1.WEB框架:
2.Django安装:
3.Django程序目录:
4.Django配置文件:
5.Django静态文件路径
6.Django额外配置
7.Django增删改查(原生pymysqle)
a.ORM(班级管理表)
b.路由关系
c.视图函数
d.Ajax(jQuery)
e.其他
8.Http请求生命周期
9.用户登录
10.ORM操作
11.分页
12.xss跨站脚本攻击
13.CSRF跨站请求伪造
14.Session
15.FBV、CBV
16.fk自关联
17.MVC,MTV
18.中间件
19.Form组件
20. Ajax
21.- JSONP
################################################################
1.WEB框架:
HTTP:
无状态、短连接(连一次,回一次断开连接)
2.Django框架:
安装命令:pip3 install django
Django请求生命周期
- 中间件 -> url -> 视图...
3.Django程序目录:
mysite mysite - settings.py # Django配置文件 - url.py # 路由系统:url->函数 - wsgi. py # 用于定义Django用socket, wsgiref,uwsgi
4.配置文件:
模板路径 template目录 TEMPLATES = [ { ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘, ‘DIRS‘: [os.path.join(BASE_DIR, ‘template‘)], ‘APP_DIRS‘: True, ‘OPTIONS‘: { ‘context_processors‘: [ ‘django.template.context_processors.debug‘, ‘django.template.context_processors.request‘, ‘django.contrib.auth.context_processors.auth‘, ‘django.contrib.messages.context_processors.messages‘, ], }, }, ]
5. 静态文件路径
static目录
STATIC_URL = ‘/static/‘
STATICFILES_DIRS = (
os.path.join(BASE_DIR,‘static‘),
)
6. 额外配置
MIDDLEWARE = [
‘django.middleware.security.SecurityMiddleware‘,
‘django.contrib.sessions.middleware.SessionMiddleware‘,
‘django.middleware.common.CommonMiddleware‘,
#‘django.middleware.csrf.CsrfViewMiddleware‘,
‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
‘django.contrib.messages.middleware.MessageMiddleware‘,
‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
]
7.增删改查(pymysqle)
a. ORM(班级管理):http://www.cnblogs.com/xuaijun/articles/7018089.html b.路由关系 url -> 函数 终止符: ^edit$ 伪静态(^$ .html) url(r‘^edit/(\w+).html$‘, views.edit), a. 路由分发 urls.py url(r‘^app01/‘, include(‘app01.urls‘)), app01.urls.py url(r‘^index.html$‘, views.index), b. /add-user/(\d+)/ -> def add_user(request,a1) name=n1 c. /login/ -> def login d. /add-user/(\d+)/ -> def add_user(request,a1) e. /add-user/(?P<a1>\d+)/ -> def add_user(request,a1) urlpatterns = [ url(r‘^admin/‘, admin.site.urls), ] c.视图函数 def index(request): request.method request.GET request.POST return HttpResponse(‘字符串‘) return redirect(‘URL‘) return render(request,‘模板路径‘,{}) # 1. 获取模板+数据,渲染 d. 1.Form表单提交,页面会刷新 2.Ajax提交页面不刷新 4. js实现页面跳转: location.href = "http://www.mamicode.com/要跳转的地址" e. 1.$.ajax({ url: ‘要提交的地址‘, type: ‘POST‘, // GET或POST,提交方式 data: {‘k1‘: ‘v1‘,‘k2‘:‘v2‘}, // 提交的数据 success:function(data){ // 当前服务端处理完毕后,自动执行的回调函数 // data返回的数据 } }) 2. Ajax(jQuery) $.ajax({ url: ‘‘, type: ‘GET‘, data: {k1:‘v1‘}, success:function(arg){ location.log(arg) } }) f.其他 1. BootStrap响应式布局: @media() 2. 栅格: 3. 表格 4. 导航条 5. 路径导航 6. fontawesome 7. 布局position:absolute 8. 当鼠标移动到xx样式的标签上时,其子标签.g应用以下属性 .xx:hover .g{ } 9. Django母版 母版: <html> js: {% block s1 %} {%endblock%} ... 主体内容:{% block s2 %} {%endblock%} ... cs: {% block s3 %} {%endblock%} </html> 子板: {% extends "layout.html "%} {% block s1 %} <h1>主内容</h1> {%endblock%} {% block s2 %} <h1>主内容</h1> {%endblock%} {% block s3 %} <h1>主内容</h1> {%endblock%}
8.Http请求生命周期
请求头 -> 提取URL -> 路由关系匹配 -> 函数 (模板+数据渲染) -> 返回用户(响应头+响应体)
9. 用户登录
- cookie:保存在浏览器端“键值对”,设置超时时 - 发送Http请求时,在请求头中携带当前所有可访问的cookie - 响应头 - 写cookie(带装饰器): @xzxx def index(request): obj = HttpResponse(‘...‘) obj.set_cookie(.....) request.COOKIES.get(...) obj.set_signed_cookie(.....) request.get_signed_cookie(....)
10.ORM操作
Http请求: url -> 视图(模板+数据) 步骤: 1. 创建数据库 2. DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘:‘s4day70db‘, ‘USER‘: ‘root‘, ‘PASSWORD‘: ‘‘, ‘HOST‘: ‘localhost‘, ‘PORT‘: 3306, } } 3. __init__ import pymysql pymysql.install_as_MySQLdb() ORM操作表: 创建表 修改表 删除表 ORM链表操作: ##创建表##(models) class UserType(models.Model): """ 用户类型 """ title = models.CharField(max_length=32) # fo = models.ForeignKey(‘Foo‘) class UserInfo(models.Model): """ 用户表 """ name = models.CharField(max_length=32) age = models.IntegerField() ut = models.ForeignKey(‘UserType‘) django自建第三方表格 # m = models.ManyToManyField(‘Girl‘) ##创建数据##(views) from app01 import models def test(request): # UserType创建数据 models.UserType.objects.create(title=‘撒比用户‘) models.UserType.objects.create(title=‘二笔用户‘) models.UserType.objects.create(title=‘牛逼用户‘) # UserInfo创建数据 models.UserInfo.objects.create(name=‘李世民‘,age=‘66‘,ut_id=1) models.UserInfo.objects.create(name=‘成吉思汗‘, age=‘23‘, ut_id=2) models.UserInfo.objects.create(name=‘嬴政‘, age=‘6‘, ut_id=3) models.UserInfo.objects.create(name=‘富播代‘, age=‘56‘, ut_id=2) models.UserInfo.objects.create(name=‘刘邦‘, age=‘45‘, ut_id=1) models.UserInfo.objects.create(name=‘李煜‘, age=‘76‘, ut_id=3) return HttpResponse(‘哥们终于进来了‘) ##正向操作##反向操作## UserInfo表,ut是FK字段 - 正向操作 PS: 一个用户只有一个用户类型 obj = models.UserInfo.objects.all().first() print(obj.name,obj.age,obj.ut.title) UserType表,表名小写_set.all() - 反向操作 与之关联表里有ForeignKey,才可以反操作。 比如:UserType和UserInfo表里有ForeignKey,UserType才可以反操作 class UserType(models.Model): title = models.CharField(max_length=32) class UserInfo(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() ut = models.ForeignKey(‘UserType‘) PS: 一个用户类型下可以有很多用户 obj = models.UserType.objects.all().first() print(‘用户类型‘,obj.id,obj.title) for row in obj.userinfo_set.all(): print(row.name,row.age) ###filter进行二次筛选### userinfo_set.filter进行二次筛选 result = models.UserType.objects.all() for item in result: print(item.title,item.userinfo_set.filter(name=‘xx‘)) ###values与values_list### 用values取值,取到字典 result = models.UserInfo.objects.all().values(‘id‘,‘name‘) QuerySet[{‘id‘:‘xx‘,‘name‘:‘xx‘} ] for row in result: print(row) 用values_list取值,取到元组 result = models.UserInfo.objects.all().values_list(‘id‘,‘name‘) QuerySet[(1,‘f‘), ] for row in result: print(row) 操作数据行: 1.增加: models.UserInfo.objects.create(user=‘root‘,password=‘123‘,age=10,ug_id=1) obj = models.UserGroup.objects.filter(id=1).first() models.UserInfo.objects.create(user=‘root‘,password=‘123‘,age=10,ug=obj) 2. 删除: models.UserInfo.objects.filter(id=2).delete() 3. 修改: models.UserInfo.objects.filter(id=2).update(title=‘公关部‘) 4. 查询: group_list = models.UserInfo.objects.all() ORM利用pymysql第三方工具连接数据库 默认: SQLlite MySQL: mysql -> MySQLDB(修改django默认连接mySQL方式) Terminal写命令创建表格: Python manage.py makemigrations python manage.py migrate Terminal写命令创建文件夹: python manage.py startapp app01 ORM操作 from app01 import models # 运行文件模块 from django.db.models import F # 引入F对象 from django.db.models import Q # 引入Q对象 from django.db.models import Count,Sum,Max,Min # 分组模块 def test(request): #################ORM操作###################### ####排序(order_by)#### 写id,从小到大排序 写-id,从大到小排序 models.UserInfo.objects.filter(id__gt=6).delete() #删除UserInfo表里大于6的数据 user_list = models.UserInfo.objects.all().order_by(‘-id‘,‘name‘) # 取UserInfo对象 print(user_list) ######################## ####分组(annotate)#### v=models.UserInfo.objects.values(‘ut_id‘).annotate(xxx=Count(‘id‘)) v=models.UserInfo.objects.values(‘ut_id‘).annotate(xxx=Sum(‘id‘)) v=models.UserInfo.objects.values(‘ut_id‘).annotate(xxx=Count(‘id‘)).filter(xxx__gt=2) filter放前面先取大于2的数据,filter放后面然后在进行二次筛选 v=models.UserInfo.objects.filter(xxx__gt=2).values(‘ut_id‘).annotate(xxx=Count(‘id‘)).filter(xxx__gt=2) print(v.query) ######################## ############################################################################################### models.UserInfo.objects.filter(id__gt=1) # 获取id大于1的值 models.UserInfo.objects.filter(id__gte=1) # 获取id大于等于1的值 models.UserInfo.objects.filter(id__lt=10) # 获取id小于10的值 models.UserInfo.objects.filter(id__lte=10) # 获取id小于10的值 models.UserInfo.objects.filter(id__lt=10,id__gt=1) # 获取id大于1 且 小于10的值 models.UserInfo.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 models.UserInfo.objects.exclude(id__in=[11, 22, 33]) # 获取id不等于11、22、33的数据 models.UserInfo.objects.filter(id__range=[1, 2]) # 获取id范围(bettwen and) models.UserInfo.objects.filter(name__startswith=‘xxxx‘) #获取name以xxxx开头的 models.UserInfo.objects.filter(name__contains=‘xxxx‘) #获取name包含xxxx开头的 models.UserInfo.objects.exclude(id=1) #获取id不等于1的 ############################################################################################### ####F:自增#### F:自增 s=models.UserInfo.objects.all().update(age=F("age")+1) #age自增 1 print(s) ################ ###############Q :用于构造复杂查询条件######## Q使用两种方式:对象方式,方法方式 传值方式: 方式一: models.UserInfo.objects.filter(id=1,name="root") 方式二: cb={ ‘id‘:1, ‘name‘:‘root‘ } models.UserInfo.objects.filter(**cb) # models.UserInfo.objects.filter(Q(id=1)) models.UserInfo.objects.filter(Q(id=1) | Q(id=10)) models.UserInfo.objects.filter(Q(id=1) & Q(id=10)) Q :用于构造复杂查询条件 方式一: Q(nid__gt=10) Q(nid=8) | Q(nid__gt=10) Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption=‘root‘) 方式二: q1 = Q() q1.connector = ‘OR‘ q1.children.append((‘id‘, 1)) q1.children.append((‘id‘, 10)) q1.children.append((‘id‘, 9)) q2 = Q() q2.connector = ‘OR‘ q2.children.append((‘c1‘, 1)) q2.children.append((‘c1‘, 10)) q2.children.append((‘c1‘, 9)) q3 = Q() q3.connector = ‘AND‘ q3.children.append((‘c1‘, 1)) q3.children.append((‘c1‘, 10)) q2.add(q3,‘OR‘) con = Q() con.add(q1, ‘AND‘) con.add(q2, ‘AND‘) (id=1 or id=10 or id=9 or(cl=1 and cl=2))and(cl=1 or cl=10 or cl=9) Q举例: cc ={ ‘k2‘:[2,3,4,5], ‘k3‘:[4,5,6], ‘k4‘:[5,6] } con = Q() for k,v in cc.items(): q = Q() q.connector = ‘OR‘ for i in v: q.children.append((‘id‘,i)) con.add(q, ‘AND‘) models.UserInfo.objects.filter(con) ###################################################### ############(extra)############# """ select id, name, (select count(1) from tb) as n from xb where .... """ ################################## a. 映射 select select_params=None select 此处 from 表 v = models.UserInfo.objects.all().extra( select={ ‘n‘:"select count(1) from app01_usertype where id=%s or id=%s", ‘m‘:"select count(1) from app01_usertype where id=%s or id=%s", }, select_params=[1,2,3,4]) for obj in v: print(obj.name,obj.id,obj.n) #################################### b. 条件 where=None params=None, select * from 表 where 此处 models.UserInfo.objects.extra( where=["id=1", "name=‘alex‘"] ) models.UserInfo.objects.extra( where=["id=1 or id=%s ", "name=%s"], params=[1, "alex"] ) #################################### PS: Django帮助我们数据转换 -> 字典 =》 Form组件(用户请求规则验证+数据字典) ==========================补充1========================== # q = models.UserInfo.objects.all() # select * from userinfo # select * from userinfo inner join usertype on ... # for row in q: # print(row.name,row.ut.title) # select_related: 查询主动做连表 # q = models.UserInfo.objects.all().select_related(‘ut‘,‘gp‘) # select * from userinfo # select * from userinfo inner join usertype on ... # for row in q: # print(row.name,row.ut.title) # prefetch_related: 不做连表,做多次查询 # q = models.UserInfo.objects.all().prefetch_related(‘ut‘) # select * from userinfo; # Django内部:ut_id = [2,4] # select * from usertype where id in [2,4] # for row in q: # print(row.id,row.ut.title)
11.分页:http://www.cnblogs.com/xuaijun/articles/7080836.html
12.xss跨站脚本攻击:http://www.cnblogs.com/xuaijun/p/7091452.html
13.CSRF跨站请求伪造:http://www.cnblogs.com/xuaijun/p/7092169.html
14.Session:
15.FBV、CBV
##视图CBV## form表单只能以 post,get请求提交 内部通过反射实现 def test(request): return HttpResponse(‘----- ‘) from django.views import View #导入模块,继承特殊类 class Login(View): """ get:查 post:创建 put:更新 delete:删除 """ def dispatch(self, request, *args, **kwargs): obj = super( Login,self).dispatch(request, *args, **kwargs) return obj def get(self,request): # return HttpResponse(‘login.get‘) return render(request,‘login.html‘) def post(self,request): print(request.POST.get(‘user‘)) return HttpResponse(‘login.post‘)
16.FK自关联
#####################FK自关联############################## # class Comment(models.Model): # """ # 评论表 # """ # news_id = models.IntegerField() # 新闻ID # content = models.CharField(max_length=32) # 评论内容 # user = models.CharField(max_length=32) # 评论者 # reply = models.ForeignKey(‘Comment‘,null=True,blank=True,related_name=‘xxxx‘) # """ # 新闻ID reply_id # 1 1 别比比 root null # 2 1 就比比 root null # 3 1 瞎比比 shaowei null # 4 2 写的正好 root null # 5 1 拉倒吧 由清滨 2 # 6 1 拉倒吧1 xxxxx 2 # 7 1 拉倒吧2 xxxxx 5 # """ # """ # 新闻1 # 别比比 # 就比比 # - 拉倒吧 # - 拉倒吧2 # - 拉倒吧1 # 瞎比比 # 新闻2: # 写的正好 # """ #################################################################
17. MVC,MTV
models(数据库,模型) views(html模板) controllers(业务逻辑处理) --> MVC
models(数据库,模型) templates(html模板) views(业务逻辑处理) --> MTV
Django -> MTV
18.中间件:(- 应用:对所有请求或一部分请求做批量处理)
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图。 与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类 中间件中可以定义四个方法,分别是: process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) process_response(self, request, response) 以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。 自定义中间件 1、创建中间件类(单独建py文件) from django.utils.deprecation import MiddlewareMixin #######################中间件############################# from django.shortcuts import HttpResponse class M1(MiddlewareMixin): def process_request(self, request): #处理请求,不放返回值 print(‘m1.process_request‘) # return HttpResponse(‘不要在往下周了‘) def process_view(self, request, callback, callback_args, callback_kwargs): print(‘m1.process_view‘) response = callback(request,*callback_args,**callback_kwargs) return response def process_response(self, request, response): #处理返回 print(‘m1.process_response‘) return response class M2(MiddlewareMixin): def process_request(self, request): print(‘m2.process_request‘) # return HttpResponse(‘不要在往下周了‘) def process_view(self, request, callback, callback_args, callback_kwargs): print(‘m2.process_view‘) def process_response(self, request, response): print(‘m2.process_response‘) return response 2、注册中间件(settings) MIDDLEWARE_CLASSES = ( ‘django.contrib.sessions.middleware.SessionMiddleware‘, ‘django.middleware.common.CommonMiddleware‘, ‘django.middleware.csrf.CsrfViewMiddleware‘, ‘django.contrib.auth.middleware.AuthenticationMiddleware‘, ‘django.contrib.auth.middleware.SessionAuthenticationMiddleware‘, ‘django.contrib.messages.middleware.MessageMiddleware‘, ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘, ‘M1‘, ‘M2‘, )
19.Form组件
- 验证:Form提交(刷新,失去上次内容) - 保留上次输入内容:(- 生成HTML标签) Django提供 Form组件: 1. 定义规则 from django.forms import Form from django.forms import fields class xxx(Form): xx = fields.CharField(required=True,max_lenght.,min,error_message=) 2. 使用 obj = xxx(request.POST) # 是否校验成功 v = obj.is_valid() # html标签name属性 = Form类字段名 # 所有错误信息 obj.errors # 正确信息 obj.cleaned_data 3.实列:http://www.cnblogs.com/xuaijun/p/7111529.html 4.增,删,改,查http://www.cnblogs.com/xuaijun/articles/7118241.html 5.上传文件:http://www.cnblogs.com/xuaijun/articles/7121844.html 6.Select框,修复Bug,刷新无法动态显示数据库内容,扩展 a.Select框: 单选 cls_id = fields.IntegerField( # widget=widgets.Select(choices=[(1,‘上海‘),(2,‘北京‘)]) widget=widgets.Select(choices=models.Classes.objects.values_list(‘id‘,‘title‘),attrs={‘class‘: ‘form-control‘}) ) cls_id = fields.ChoiceField( choices=models.Classes.objects.values_list(‘id‘,‘title‘), widget=widgets.Select(attrs={‘class‘: ‘form-control‘}) ) obj = FooForm({‘cls_id‘:1}) 多选 xx = fields.MultipleChoiceField( choices=models.Classes.objects.values_list(‘id‘,‘title‘), widget=widgets.SelectMultiple ) obj = FooForm({‘cls_id‘:[1,2,3]}) b.修复Bug,刷新无法动态显示数据库内容: 方式一: class TeacherForm(Form): tname = fields.CharField(min_length=2) # xx = form_model.ModelMultipleChoiceField(queryset=models.Classes.objects.all()) # xx = form_model.ModelChoiceField(queryset=models.Classes.objects.all()) 方式二: class TeacherForm(Form): tname = fields.CharField(min_length=2) xx = fields.MultipleChoiceField( widget=widgets.SelectMultiple ) def __init__(self,*args,**kwargs): super(TeacherForm,self).__init__(*args,**kwargs) self.fields[‘xx‘].widget.choices = models.Classes.objects.values_list(‘id‘,‘title‘) c. 扩展 - is_valid - 字段 = 默认正则表达式 - 额外的正则 from django.forms import Form from django.forms import widgets from django.forms import fields from django.core.validators import RegexValidator class MyForm(Form): user = fields.CharField( validators=[RegexValidator(r‘^[0-9]+$‘, ‘请输入数字‘), RegexValidator(r‘^159[0-9]+$‘, ‘数字必须以159开头‘)], ) - clean_字段,必须返回值 - clean() 有返回值:cleaned_data = http://www.mamicode.com/返回值>
20. Ajax
AJAX全套:http://www.cnblogs.com/xuaijun/p/7126742.html
应用:http://www.cnblogs.com/xuaijun/articles/7127855.html
21.- JSONP
- JSONP - 同源策略 - 限制:Ajax - 不限制:script 开发需求:向其他网站发Http请求 - 浏览器直接发送请求【考虑同源】 - 浏览器->服务端->发送请求 浏览器直接发送请求【考虑同源】 要求: 1. 客户端 - URL?callback=xxxx - function xxxx(arg){} 2. 服务端 - 获取 funcname = request.GET.get(callback) - 返回: funcname(....) 使用: 1. 自己写动态创建script function getUsers(){ var tag = document.createElement(‘script‘); tag.src = "http://www.s4.com:8001/users/?funcname=bbb?sdd"; document.head.appendChild(tag); } 2. jQuery $.ajax({ url: ‘http://www.s4.com:8001/users/‘, type: ‘GET‘, dataType: ‘JSONP‘, jsonp: ‘funcname‘, jsonpCallback: ‘bbb‘ }) 其他: - 只能发GET请求 - 约定 JSONP是一种方式,目的解决跨域问题 - CORS 简单请求: def new_users(request): obj = HttpResponse(‘返回内容‘) obj[‘Access-Control-Allow-Origin‘] = "*" return obj 复杂请求: def new_users(request): if request.method == "OPTIONS": obj = HttpResponse() obj[‘Access-Control-Allow-Origin‘] = "*" obj[‘Access-Control-Allow-Methods‘] = "DELETE" return obj obj = HttpResponse(‘asdfasdf‘) obj[‘Access-Control-Allow-Origin‘] = "*" return obj 其他: - 任何请求
django知识点总结