标签:code sql http ror ida select closed row 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 = "要跳转的地址"
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 = 返回值
无返回值:cleaned_data = 原来的值
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
其他:
- 任何请求
标签:code sql http ror ida select closed row django安装
原文地址:http://www.cnblogs.com/xuaijun/p/7137079.html