首页 > 代码库 > 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:
    无状态、短连接(连一次,回一次断开连接)
View Code

2.Django框架:

技术分享
 安装命令:pip3 install django
    Django请求生命周期
    - 中间件 -> url -> 视图...
View Code

3.Django程序目录:

技术分享
mysite
  mysite
    - settings.py # Django配置文件
    - url.py # 路由系统:url->函数
-     wsgi.
    py # 用于定义Django用socket, wsgiref,uwsgi
View Code

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,
  ],
  },
  },
  ]
View Code

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知识点总结