一、web開發與視圖類,restful
(一)視圖類
視圖:可以被調用的的對象,接收一個請求,返回響應。
之前寫的是函數視圖。
以類定義的視圖,叫做類視圖。
函數視圖:以函數定義的視圖,每個視圖處理一個請求,一種類型的請求。代碼可讀性較差。
類視圖:以類定義的視圖,定義各種方法分別處理不同請求。
(二)視圖類的使用
視圖
路由
結果–使用postman發送請求,進行驗證
post、put、delete發送請求,有csrf驗證
將指定視圖避免csrf驗證的方法:
優化視圖–返回統一格式
1.實現get請求
get:獲取商品數據
傳id參數時,查詢指定id的數據,不傳id參數時,查詢所有數據
class GoodsView(View):
def __init__(self):
super().__init__()
# 構造一個返回的格式
self.result = {
'version':'v1.0',
'code':200,
'data':''
}
self.obj=Goods
def get(self,request):
# 返回商品信息
id = request.GET.get('id')
if id:
goods = self.obj.objects.filter(id=id)
else:
goods = self.obj.objects.all()
data=[]
for one in goods:
data.append({
'goods_number':one.goods_number,
'goods_name':one.goods_name,
'goods_price':one.goods_price,
'goods_count':one.goods_count,
'goods_location':one.goods_location,
'goods_safe_date':one.goods_safe_date,
'goods_pro_time':one.goods_pro_time,
})
self.result['data']=data
return JsonResponse(self.result)
發送請求
2.實現post請求
def post(self,request):
# 用來保存數據
data = request.POST
goods = self.obj()
goods.goods_number=data.get('goods_number')
goods.goods_name=data.get('goods_name')
goods.goods_price=data.get('goods_price')
goods.goods_count=data.get('goods_count')
goods.goods_location=data.get('goods_location')
goods.goods_safe_date=data.get('goods_safe_date')
goods.goods_status=data.get('goods_status')
goods.save()
self.result['data']={
'id':goods.id,
'data':'保存成功'
}
return JsonResponse(self.result)
發送請求
數據庫
3.實現put請求
import json
轉成json對象,序列化
json.dumps
json.dump 操作文件 文件->xxx.json 經常配合open使用
反序列化
json.loads
json.load 操作文件 xxx.json->文件 經常配合open使用
def put(self,request):
# 更新數據
# 更新指定id的商品的名字
# request.body是一個bytes類型
# json.loads需要一個string類型 bytes->string decode
data = json.loads(request.body.decode())
print(data)
id=data.get('id')
goodsname=data.get('goodsname')
goods=self.obj.objects.get(id=id)
goods.goods_name=goodsname
goods.save()
self.result['data'] = {
'id':id,
'data':'商品名稱更新成功'
}
return JsonResponse(self.result)
發送請求
數據庫
4.實現delete請求
def delete(self,request):
# 獲取商品id,將該數據刪除
data = json.loads(request.body.decode())
id = data.get('id')
self.obj.objects.filter(id=id).delete()
self.result['data']={
'id':id,
'data':'商品刪除成功'
}
return JsonResponse(self.result)
發送請求
(三)DRF–Django Restful Framework
pep8:編碼規範
restful:一種接口的編寫風格,設計風格
講究資源
DRF就是django提供的一種restful編寫風格的接口插件
1.基本使用
安裝
pip install djangorestframework
pip install django-filter
配置settings.py
django安裝的插件是以app的形式存在的
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES':[
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
過濾器
from rest_framework import serializers
from LoginUser.models import *
class GoodsSerializer(serializers.HyperlinkedModelSerializer):
class Meta: # 元類
model = Goods # 遍歷的對象
fields = [
'id',
'goods_number',
'goods_name',
'goods_price',
'goods_count',
'goods_location',
'goods_safe_date',
'goods_status',
'goods_pro_time',
]
class UsersSerializer(serializers.HyperlinkedModelSerializer):
class Meta: # 元類
model = LoginUser # 遍歷的對象
fields = [
'email',
'password',
'username',
'phone_number',
'photo',
'age',
'gender',
'address',
]
視圖
路由
使用
所有數據
指定id的數據
2.添加增刪改功能
視圖
postman發送請求
報錯:認證缺失,“未提供身份驗證憑據”。
(四)接口總結
1.種類
函數視圖,類視圖,DRF
2.返回數據類型方式
HttpResponse,JsonResponse,HttpResponseRidirect,render…
DRF提供了增刪改查的方法
查(get)
- 獲取單條數據
- 通過id
- http://127.0.0.1:8000/API/goods/1/
- 獲取所有數據
- http://127.0.0.1:8000/API/goods/
增(post)
- http://127.0.0.1:8000/API/goods/
- 需要攜帶參數
刪(delete)
http://127.0.0.1:8000/API/goods/
修改(put)
http://127.0.0.1:8000/API/goods/
3.接口的作用
- 提供數據支持
- 爬蟲
- ajax動靜分離
- 擴大了數據的可用範圍
二、增添個人中心頁
視圖
@loginVaild
def personal_info(request):
user_id = request.COOKIES.get('userid')
user = LoginUser.objects.filter(id=user_id).first()
if request.method=="POST":
data = request.POST
user.phone_number=data.get('phone_number')
user.age=data.get('age')
user.gender=data.get('gender')
user.address=data.get('address')
user.photo=request.FILES.get('photo')
user.save()
return render(request,'personal.html',locals())
路由
模板
{% extends 'base.html' %}
{% block title %}
個人中心
{% endblock %}
{% block content %}
<form action="#" method="post" enctype="multipart/form-data">
{% csrf_token %}
<table class="table ">
<tr>
<td style="width: 300px;" rowspan="3">
<img style="width: 100%;" src="/static/{{ user.photo }}" alt=""><br>
<input type="file" name="photo">
</td>
<td>郵箱:</td>
<td><input type="text" value="{{ user.email }}" disabled></td>
<td>聯繫電話:</td>
<td><input name="phone_number" type="text" value="{{ user.phone_number }}"></td>
</tr>
<tr>
<td>年齡:</td>
<td><input name="age" type="text" value="{{ user.age }}"></td>
<td>性別:</td>
<td><input type="text" name="gender" value="{{ user.gender }}"></td>
</tr>
<tr>
<td>家庭住址:</td>
<td><input type="text" name="address" value="{{ user.address }}"></td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="5" style="text-align: center">
<input type="submit" class="btn btn-primary" value="完善用戶信息">
</td>
</tr>
</table>
</form>
{% endblock %}
三、Django項目結構
一個項目中可能有多個模塊,在一個項目中創建多個app進行管理,分別負責各自的功能模塊,可移植性比較強,方便管理。
電商項目分兩個app進行管理,一個是管理後臺(賣家),一個web前端(買家)
(一)創建一個項目Qshop
創建兩個app:
一個負責賣家 Saller
一個負責買家 Buyer
配置
將之前編寫的電商項目的文件,複製到這個新項目的Saller子應用的對應位置