1、Django的request和response对象
Request对象
- 请求方法:Request对象的method属性
- 客户端信息:Request对象的META属性
- Cookies: Request对象的COOKIES属性
- 请求参数:Request对象中的QueryDict
from django.http import HttpResponse
def helloworld(request):
print('request method: ',request.method)
print('request META:',request.META)
print('request cookies: ',request.COOKIES)
print('request QueryDict',request.GET)
return HttpResponse('OK')
请求路由目录
#在主目录下的urls
urlpatterns = [
path('admin/', admin.site.urls),
path('weather/', include('blog.urls')),
]
#在对应app下的路由
from django.urls import path
from .view import weather
urlpatterns=[
path('',weather.helloworld)
]
Response对象
- 状态码:Response对象的status属性
- 应答内容:Response对象的content属性
- 延申的Response子类:(JsonResponse,FileResponse)
根据对应的数据进行应答操作
#首先都是从django.http中引入对应的包
from django.http import HttpResponse,JsonResponse,FileResponse
#http应答
#应答都是使用3位数字来表示
return HttpResponse(content='Hello Django response',status=201)
#json应答
m={
"message":"Hello Django Response"
}
#safe=False 不检查任何Json对象,将任何对象转为json
#safe=true 只能转换为dictionary对象
return JsonResponse(data=m,safe=False,status=200)
实战天气查询
首先引入第三方库记录对应函数:
#其实我的理解这部分就相当于后台的操作
def weather(cityname):
# :param cityname:城市名字
# :return:返回实况天气
key='e3c87accfae6bd943172c97743fdff65'
api='http://v.juhe.cn/weather/index'
params='cityname=%s&key=%s'%(cityname,key)
url=api+'?'+params
print(url)
response=requests.get(url=url)
json_data=json.loads(response.text)
print(json_data)
result=json_data.get('result')
sk=result.get('sk')
response=dict()
response['temperature']=sk.get('temp')
response['wind_direction'] = sk.get('wind_direction')
response['wind_strength'] = sk.get('wind_strength')
response['humidity'] = sk.get('humidity')
response['time'] = sk.get('time')
return response
然后修改对应的weather下的路由
urlpatterns=[
# path('',weather.helloworld)
path('',weather.weather)
]
之后在前端根据访问类型不同定义访问函数
我自己的理解是get只能经详一次获得对应的文件
而post是可以给参数多样化进行传递的
def weather(request):
if request.method=='GET':
city=request.GET.get('city')
data=juhe.weather(city)
return JsonResponse(data=data,status=200)
elif request.method=='POST':
received_body=request.body
received_body=json.loads(received_body)
cities=received_body.get('cities')
response_data=[]
for city in cities:
result=juhe.weather(city)
result['city']=city
response_data.append(result)
return JsonResponse(data=response_data,safe=False,status=200)
2、Django的url配置
Django处理请求的寻址逻辑
- 项目层面——根路由模块:urlpatterns数组
- 应用层面——子路由模块:urlpatterns数组
- 试图层面调用正确的视图层面
#【1】首先在django下的settings中可以看到
ROOT_URLCONF = 'Django1.urls'
#【2】然后进入Django1.urls可以看到
urlpatterns = [
path('admin/', admin.site.urls),
path('weather/', include('blog.urls')),
]
#【3】然后进入子路由模块'blog.urls'
urlpatterns=[
# path('',weather.helloworld)
path('',weather.weather)
]
Django的RESTful url设计
调用者RESTful简单易读
开发者容易设计结构
- API接口的RESTful设计](https://img-blog.csdnimg.cn/20191128113214101.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODM2MjI0,size_16,color_FFFFFF,t_70)
要进行对API接口的说明- 说明接口类型(视图
/view
,模板/template
,API/api
) - 说明接口版本
/view/v1
,/template/v1.2
,/api/v2.0.1
- 说明接口类型(视图
- 增删改查RESTful设计
HTTP请求中的GET、POST、PUT、DELETE方法
请求方法 | 作用 |
---|---|
GET | 从服务器中获取资源 |
POST | 在服务器中新建一个资源 |
PUT | 在服务器上更新资源 |
DELETE | 从服务器中删除资源 |
距离获取用户信息:GET:/api/v1.0/user
url的过滤信息(分页、指定)
GET:/api/v1.0/user/1
GET:/api/v1.0/user?page=1
通过请求参数过滤信息
GET:/api/v1.0/user?name=imooc
- 资源路径的RESTful设计
说明资源类型,也可以附上更加丰富的信息类型
GET:/api/v1.0/resource/image?md=<md5>
GET:/api/v1.0/resource/doc?md=<md5>
#【1】首先在django下的settings中可以看到
ROOT_URLCONF = 'Django1.urls'
#【2】然后进入Django1.urls可以看到
urlpatterns = [
path('admin/', admin.site.urls),
# path('weather/', include('blog.urls')),
path('blog/v1.0', include('Django1.version_1.0')),
]
#【3】然后在version_1.0中进入'
urlpatterns = [
path('service/', include('blog.urls')),
# path('weather/', include('blog.urls')),
]
#【4】最后来到blog目录下的urls进入
urlpatterns=[
# path('',weather.helloworld)
# path('',weather.weather)
path('weather',weather.weather)
]
post——新增
put——修改
get——查询
delete——删除
通过类视图的方式管理视图进行操作
有状态服务
有状态服务,无状态服务
有记忆的凭证保存
数据上下文
session 凭证
HTTP中协议的凭证
小程序中的状态管理
sessions配置
自建用户体系比较复杂
沿用微信的用户体系——openID去开发用户
用户模型与用户视图
用户的唯一标识——openid
用户的基本信息(nickname)
在model下建立对应模型
其实就是以类的方式进行保存
需要进行数据库的迁移
python manage.py makemigrations
检查数据模型发生变化了没
python manage.py migrate
对数据模型进行修改
dbshell 数据库操作实现
模型层
Xampp——全家桶的Mysql工具
Navicat——数据管理工具
二、数据库迁移
1、迁移的必要性
数据库无法打开
通过xammp去打开对应SQL区
但必须对应迁移
2、Django ORM框架
①、屏蔽数据库差异
②、提供迁移工具
③、简化开发流程
迁移的过程
数据+表结构迁移
①、数据备份
python manage.py dumpdata authorization >authorization_data.json
②、表结构同步
创建MySQL数据库更新配置
先将创建的注释掉再修改
slave数据库只有default数据库失败了之后才能继续使用该数据库,slave数据库是一个备份数据库,但是数据之间是可以完成对应同步操作的
③、数据迁移
将数据备份导入mysql中就可以继续使用对应的mysql数据库信息就可以
索引
索引特征
1、加快检索数据速度
2、降低增删改查速度
添加索引的方法
A、属性中定义索引
通过db_index=true进行索引
任何数据库操作后都需要对应的实现
B、模型中定义Meta中定义索引
class Meta:
indexes = [
models.Index(fields=[‘nickname’]),
models.Index(fields=[‘open_id’,‘nickname’]),
}
主键默认索引
外键默认索引
关系映射
三种关系映射
一对一关系
一对多映射
多对多关系
Django表达关系映射
// 删除father后mother不删除
class Father(models.Model):
wife=models.OneToOneField(Mother,on_delete=models.DO_NOTHING)
pass
数据库操作
增
创建用户操作
首先配置django环境,然后有两种方式添加对应用户
批量插入方法
bulk_create方法
查:
数据过滤:
数据排序
连续查询
改![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1dafb83c55f96f6267e311da61a0d17e.png)
批量改
删除与批量删除
全部删除
数据库函数
字符串连接函数
字符长度函数
大小写函数
日期处理函数
获取当前时间
Now()函数
Trunc函数按某天或者某月操作
数据库的模型层优化
1、模型变更与迁移
模型迁移操作
** A、模型变更——用户层面
B、makemigrations——DJango层面
migrations下保存模型的更改(时间操作实现)
C、migrate——DB层面 **
迁移命令
显示操作的SQL语句
历史迁移记录
迁移文件详解
dependencies,指明迁移的依赖
operations:指明迁移的具体操作
懒加载与预加载
懒加载问题根源
1、ORM的不透明性
2、懒加载是什么
预加载方法
会提前加载属性
性能对比
预加载的数据会更快一点,预加载要比懒加载快的太多了
数据库长连接
长连接数据逻辑
避免负优化
可调用(可通过函数方式调用);不可调用就是不可以被函数方式调用
可调用属性是可以通过设置python变量,然后使用变量去优化
批量操作