django基础02

django基础02

1、使用虚拟环境建django项目
  • 1、workon 虚拟环境命令

  • 2、创建django项目 django-admin starproject 项目名

  • 3、创建app python manage.py startapp 应用名

  • 4、更改配置

  • 注册app

  • 更改大路由包含所有的小app里的路由

  • app里写url和对应的views

  • libs 存放第三方包

  • media 静态文件

  • utils 存放自己的方法 可以公用的

    ① 、为了方便管理app,我们添加专门的apps文件夹来存放所有的app。结构如下

img

1.1设置完apps文件夹以后我们需要对配置文件做相应的更改

1.1.1、在seetings.py里添加django文件的导包路径

#settings.py 

import sys 
sys.path.insert(0, os.path.join(BASE_DIR,'apps'))

img

1.1.2、django的导包路径添加完毕,这时候可以像原来一样引用文件了。但是这时候你的pycharm编辑器还是不能正确的显示导包总是给你报红。

img

1.1.3、这时候你需要把apps这个文件夹设为源码根即可解决这个问题

img

②、添加libs存放第三img

img

③、添加utils文件夹存放封装的公用

img

④、添加media存放图片

img

⑤、创建static手机模板的静态文件

img

2、添加sys.path的作用?

​ import sys

​ sys.path.insert(0, os.path.join(BASE_DIR, ‘apps’))

​ 增加导包路径

3、base_dir的作用?

​ manage.py文件的路径

4、RESTFUL风格API
1.1 什么是RESTful
  • REST与技术无关,代表的是一种软件架构风格(REST是Representational State Transfer的简称,中 文翻译为“表征状态转移”)

  • REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识

  • 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资 源是REST区别与其他架构风格的最本质属性

  • 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA: Resource Oriented Architecture)

1.2web开发本质
  • 对数据库中的表进行增删改查操作
  • Restful风格就是把所有数据都当做资源,对表的操作就是对资源操作
  • 在url同通过 资源名称来指定资源
  • 通过 get/post/put/delete/patch 对资源的操作
5、RESTFUL API设计规范
  • 1.API与用户的通信协议,总是使用HTTPs协议。

  • 2.域名

    1)子域名方式  
    https://api.example.com 尽量将API部署在专用域名(会存在跨 域问题)   
    https://www.example.com

    2)url方式
    https://example.org   
    https://example.org/api/ API很简单

  • 3.版本
URL,如:https://api.example.com/v1/ 
请求头       跨域时,引发发送多次请求
  • 4.面向资源编程 : 路径,视网络上任何东西都是资源,均使用名词表示(可复数)
https://api.example.com/v1/zoos 
https://api.example.com/v1/animals
https://api.example.com/v1/employees
  • 5.method
GET(查询数据)     # 从服务器取出资源(一项或多项) 
POST(创建数据)    # 在服务器新建一个资源 
PUT(修改数据)     # 在服务器更新资源(客户端提供改变后的完整资源) 
PATCH(修改属性)   # 在服务器更新资源(客户端提供改变的属性) 
DELETE(删除数据)  # 从服务器删除资源
  • 6.过滤,分页,排序 :通过在url上传参的形式传递搜索条件
https://api.example.com/v1/zoos?limit=10:指定返回记录的数量 
https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置 
https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数 
https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序, 以及排序顺序 
https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件
  • 状态码
'''1. 2XX请求成功''' 
# 200 请求成功,一般用于GET与POST请求 
# 201 Created - [POST/PUT/PATCH]:用户新建或修改数据成功。 
# 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务) 
# 204 NO CONTENT - [DELETE]:用户删除数据成功。 

'''2. 3XX重定向''' 
# 301 NO CONTENT - 永久重定向 
# 302 NO CONTENT - 临时重定向 

'''3. 4XX客户端错误''' 
# 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误。 
# 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。 
# 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。 
# 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录。 
# 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格 式)。 
# 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。 
# 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。 

'''4. 5XX服务端错误''' 
# 500 INTERNAL SERVER ERROR - [*]:服务器内部错误,无法完成请求 
# 501 Not Implemented     服务器不支持请求的功能,无法完成请求


更多状态码参考:https://www.runoob.com/http/http-status-codes.html
6、django和Drf的不同点

django中封装了drf

view 是 父类

class test1(View):
     def post(self,request):
          data=request.POST.get('name')
          return HttpResponse(data)
     def get(self,request):
          data = request.GET.get('name')
          return HttpResponse(data)

apiview是view的子类

class test2(APIView):
     def get(self,request):
          data=request.query_params
          return Response(data)
     def post(self,request):
          data=request.data
          return Response(data)

7、django不使用序列化器来进行查询结果序列化

# from django.http import JsonResponse

# from django.views import View

# from .models import *

# class App03(View):

#     def get(self,request):

#         user=User.objects.all()

#         list=[]

#         for i in user:

#             data={

#                 'name':i.username,

#                 'age':i.age,

#                 'home':i.home

#             }

#             list.append(data)

#             print(list)

#             return JsonResponse({'data':list})
8、DRF使用Serializer来进行序列化和反序列化操作
1、定义一个序列化器
# 这里的字段需要和模型类中的字段名、字段类型、约束一致
class UserSer(serializers.Serializer):
    username=serializers.CharField(max_length=20)
    age=serializers.IntegerField(allow_null=True)
    home=serializers.CharField(max_length=30)

想要添加数据 就需要在序列化器类中定义一个create()方法

  def create(self, validated_data):
    		 '''
            序列化器进行新增数据的方法
            :param validated_data: 通过验证的字典数据
            :return:根据RESTful设计方式,需要将添加的数据返回
            '''
        return User.objects.create(**validated_data)

想要修改数据时,需要在序列化器类中定义一个update()方法。

def update(self,instance,validated_data):
     '''
        序列化器进行修改数据的方法
        :param instance: 需要修改的模型对象
        :param validated_data: 前端传递的字典数据
        :return: 根据RESTful设计方式,需要将修改的数据返回
        '''
    # instance   你的数据库里的模型
    # validated_data     传进来要修改的数据
    instance.username=validated_data.get('username',instance.username)
    instance.age=validated_data.get('age',instance.age)
    instance.home=validated_data.get('home',instance.home)
    instance.save()
    return instance

单一字段验证 对单一字段进行验证我们需要在序列化器类中定义一个名字为(validate_字段名)的方法,来补充验证逻辑。

# def validated_username(self,attrs):     

#     if attrs !='gy':

#         raise serializers.ValidationError('不是gy本人')

#     return attrs

多字段验证 对所有字段进行扩展验证我们需要在序列化器中定义一个名字为(validate())的方法,来补充对所有字段进行扩展验证的逻辑。

def validate(self, attrs):  
	'''
        对多个字段进行验证
        :param attrs: 前段传递的字典数据
        :return: 验证成功:返回attrs;验证失败:返回错误信息
        '''
    username = attrs['username']
    age=attrs['age']
    home=attrs['home']
    print(username)
    if username != 'gy' or age!=18 or home!='河南':
    	# 失败
        raise serializers.ValidationError('不是gy本人')
      # 成功
    return attrs

class UserV(APIView):
    def get(self,request):
        users=User.objects.all()
        ser=UserSer(users,many=True)      #many=True  序列化多条数据
        data=ser.data
        return Response(data)

    def post(self,request):
        data=request.data
        ser=UserSer(data=data)
        ser.is_valid()
        
         # 打印的是sers.py里的  raise serializers.ValidationError('不是gy本人')
        print(ser.errors)    
        ser.save()
        return Response({'code':200})

    def put(self,request):
        data=request.data
        id=request.data.get('id')   
        print(data)
        print(id)
        user=User.objects.get(id=1)
        print(user)
        ser=UserSer(user,data=data)
        ser.is_valid()
        ser.save()
        return Response({'code':200})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值