2020-09-25

web工作流程图

在这里插入图片描述
在这里插入图片描述

DRF初始化

  1. 认证
  2. 权限
  3. 限流
  4. 序列化
  5. 分页
  6. 版本

1.1安装DjangoRestFramework

  • pip install djangorestframework==3.11.1
  • pip install django-filter==2.3.0 #过滤器
  • pip install markdown #Markdown support for the browsable API.

1.2在syl/settings/py中注册

INSTALLED_APPS=[
	'django_filters',
	'rest_framework',
]

#过滤器
#1,安装 django-filter
#2,注册应用
#3,配置settings, 在view里配置可过滤的字段
#4,使用 查询字符串携带过滤信息

REST_FRAMEWORK = {
# 文档报错: AttributeError: ‘AutoSchema’ object has no attribute ‘get_link’
# 用下面的设置可以解决
‘DEFAULT_SCHEMA_CLASS’: ‘rest_framework.schemas.AutoSchema’,
# 默认设置是:
# ‘DEFAULT_SCHEMA_CLASS’: ‘rest_framework.schemas.openapi.AutoSchema’,

# 异常处理器
# 'EXCEPTION_HANDLER': 'user.utils.exception_handler',

# Base API policies
'DEFAULT_RENDERER_CLASSES': [
    'rest_framework.renderers.JSONRenderer',
    'rest_framework.renderers.BrowsableAPIRenderer',
],
'DEFAULT_PARSER_CLASSES': [
    'rest_framework.parsers.JSONParser',
    'rest_framework.parsers.FormParser',
    'rest_framework.parsers.MultiPartParser'
],
# 1.认证器(全局)
'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework.authentication.SessionAuthentication',  # 使用session时的认证器
    'rest_framework.authentication.BasicAuthentication'     # 提交表单时的认证器
],
#2.权限配置(全局): 顺序靠上的严格
'DEFAULT_PERMISSION_CLASSES': [
    # 'rest_framework.permissions.IsAdminUser',  # 管理员可以访问
    # 'rest_framework.permissions.IsAuthenticated',  # 认证用户可以访问
    # 'rest_framework.permissions.IsAuthenticatedOrReadOnly',  # 认证用户可以访问, 否则只能读取
    # 'rest_framework.permissions.AllowAny',  # 所有用户都可以访问
],
#3.限流(防爬虫)
'DEFAULT_THROTTLE_CLASSES': [
    'rest_framework.throttling.AnonRateThrottle',
    'rest_framework.throttling.UserRateThrottle',
],
#3.1限流策略
'DEFAULT_THROTTLE_RATES': {
    'user': '100/hour',    # 认证用户每小时100次
    'anon': '3/day',       # 未认证用户每天能访问3次
},

'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'rest_framework.negotiation.DefaultContentNegotiation',
'DEFAULT_METADATA_CLASS': 'rest_framework.metadata.SimpleMetadata',
'DEFAULT_VERSIONING_CLASS': None,

#4.分页(全局):全局分页器, 例如 省市区的数据自定义分页器, 不需要分页
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
# 每页返回数量
'PAGE_SIZE': 10,  # 默认 None

#5.过滤器后端
'DEFAULT_FILTER_BACKENDS': [
    'django_filters.rest_framework.DjangoFilterBackend',
    # 'django_filters.rest_framework.backends.DjangoFilterBackend', 包路径有变化
],

#5.1过滤排序(全局):Filtering 过滤排序
'SEARCH_PARAM': 'search',
'ORDERING_PARAM': 'ordering',

'NUM_PROXIES': None,

#6.版本控制:Versioning  接口版本控制
'DEFAULT_VERSION': None,
'ALLOWED_VERSIONS': None,
'VERSION_PARAM': 'version',

# Authentication  认证
# 未认证用户使用的用户类型
'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser',
# 未认证用户使用的Token值
'UNAUTHENTICATED_TOKEN': None,

# View configuration
'VIEW_NAME_FUNCTION': 'rest_framework.views.get_view_name',
'VIEW_DESCRIPTION_FUNCTION': 'rest_framework.views.get_view_description',

'NON_FIELD_ERRORS_KEY': 'non_field_errors',

# Testing
'TEST_REQUEST_RENDERER_CLASSES': [
    'rest_framework.renderers.MultiPartRenderer',
    'rest_framework.renderers.JSONRenderer'
],
'TEST_REQUEST_DEFAULT_FORMAT': 'multipart',

# Hyperlink settings
'URL_FORMAT_OVERRIDE': 'format',
'FORMAT_SUFFIX_KWARG': 'format',
'URL_FIELD_NAME': 'url',

# Encoding
'UNICODE_JSON': True,
'COMPACT_JSON': True,
'STRICT_JSON': True,
'COERCE_DECIMAL_TO_STRING': True,
'UPLOADED_FILES_USE_URL': True,

# Browseable API
'HTML_SELECT_CUTOFF': 1000,
'HTML_SELECT_CUTOFF_TEXT': "More than {count} items...",

# Schemas
'SCHEMA_COERCE_PATH_PK': True,
'SCHEMA_COERCE_METHOD_NAMES': {
    'retrieve': 'read',
    'destroy': 'delete'
},

}

1.4创建user/serializers.py写序列化器

from rest_framework import serializers
from user.models import User

def address_validate(data):
	#独立校验器
	#raise serializers.ValidationError('请填写实际地址')#有错就抛出异常,没有就返回数据
	return data
	#没错就返回数据
	return data

class UserSerializer(seralizers.ModelSeralizer):
	#1.独立校验器:重新设定字段,替换掉模型中的设定,重新设定地址的长度为5
	address=serializers.CharField(max_length=255,min_length=5,validators=[address_validate])
	#2.单一字段验证,验证地址
	def validate_address(self,data):
		if data=='测试':
			raise serializers.ValidationError("请填写实际地址")#有错就抛出异常
		return data #没错就返回结果

	def validate_phone(self,data):
		#不符合手机号格式
		#raise serializers.ValidationError("手机号格式不正确")
		model=self.root.Meta.model
		num=model.objects.filter(phone=data).count()
		if num>0:
			raise serializers.ValidationError("手机好已存在")
		return data
	#3.所有属性验证器
	def validate(self,attrs):
		#attrs:{“username”:"zhangsan","phone":"23412342334",...}
		#self.context 中有request和view上下文
		#self.context['view']。action可以取到动作
		#attrs是需要序列化的数据
		#raise serializers.ValidationError("xxx错误") #有问题报错
		return attrs #没问题返回数据

	class Meta:
		model=User
		#fields=("id",)#临时添加字段也需要写在这里
		fields="__all__"#所有字段
		#exclude=["id"]#排除id字段
		read_only_fields=('',)#指定字段为read_only,
		#扩展address:extra_kwargs={}#局部替换某些字段的设定
		extra_kwargs={
			"address":{
				"min_length":5,#给地址添加最小长度限制
				"default":"默认测试地址"#增加默认值
			}
			
		}

2.DRF认证、权限、限流、分页、过滤、序列化

2.1user/urls.py

from django.urls import include,path
from user import views
from rest_framework.routers import SimplePouter,DefaultRouter

#自动生成路由方法,必须使用视图集
#router=SimpleRouter() #没有路由  /user/无法识别
router=DefaultRouter() # 有限路由
router.register(r"user",views.UserViewSet)# 配置路由
urlpatterns=[
	path("index/",views.index),
	path("api-auth/",include("rest_framework.urls",namespace="rest_framework")),
]
urlpatterns += router.urls #模块地址

2.2user/views.py

from django.http import HttpResponse
from django_filters.rest_framework imoprt DjangoFilterBackend
from rest_framework import Viewsets
from rest_framework.authentication import BasicAuthentication, SessionAuthentication
from rest_framwork.decorators import action
from rest _framwork.filters import OrderingFilter
from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.pagination import PageNumberPagination
from rest_framework.views import APIView
from rest_framework.permissions import BasePermission,SAFE_METHODS
from user.models import User
from user.serializers import UserSerializer,UserUnActiveSerializer

def index(request):
	#需要认证才能访问的试图
	return HttpResponse("hello")
#分页(局部):自定义分页器,局部
class PageNum(PageNumberPagination):
	#查询字符串中代表每页返回数据数量的参数名,默认值:None
	page_size_query_param="page_size"
	#查询字符串中代表页码的参数名,有默认值:page
	#page_query_param="page"
	#一页中最多的结果条数
	max_page_size=2
#自定义权限(局部)
class MyPermission(BasePermission):
	def has_permission(self,reqeust,view):
	print(view.kwargs.get("pk"),request.user.id)
	#判断用户对模型有没有访问权
	print(request)
	if request.user.is_superuser:
		#管理员对用户模型有访问权
		return True
	elif View.kwargs.get('pk')==str(request.user.id):
	#携带的id和用户的id相同时有访问权
	return True
return False

def has_object_permisson(self,request,view,obj):
	#获取单个数据时,判断用户对某个数据对象是否有访问权限
	if request.user.id==obj.id:
		return True
	return False

class UserViewSet(viewsets.ModelViewSet):
	queryset=User.objects.all()
	serializer_class=UserSerializer #优先使用 get_serializer_class 返回的序列化器
	#3.分页:自定义分页器  覆盖全局配置
	pagination_class =PageNum
	#4.限流:自定义限流类
	throttle_classes=[UserRateThrottle]
	filter_backends=(DjangoFilterBackend,OrderingFilter)
	ordering_fields=("date_joined","id")
	filter_fields=("username",'phone','is_active')
	filter_fields=("username",'is_active')


	def get_serializer_class(self):
		if self.action=='unactived':
			return UserUnActiveSerializer
		else:
			return UserSerializer

初始化项目结构

在这里插入图片描述

在这里插入图片描述

django-admin strartproject 项目名

(如果出现问题,在django-admin后面直接加个.py)

创建子应用
创建一个应用:
python manage.py startapp 应用名

在setting中注册应用:
在settings.py文件, INSTALLED_APP列表中增加"app名字.apps.app的管理类"

在urls中配置路由

用include方法包含二级路由

from django.urls import path,include
path(‘应用名/’,include(‘应用名.urls’))
1
2
在应用中创建urls二级路由

from django.urls import path
from.import views
urlpatterns = [
path(‘函数名/’,views.函数名),

from django.urls import path,include
path('应用名/',include('应用名.urls'))

MIDDLEWARE(中间件)

TEMPLATES(模板)

DATABASES(数据库)

LANGUAGE_CODE(语言 语言默认是美式英语,如果改成中文,en-us改成 zh-hans)

TIME_ZONE(时区 UTC是格林威治时间 | 上海时间==> Asia/shanghai)

USE_TZ=False

STATIC_URL(静态文件(css,js,img))

MIDDLEWARE(中间件)

TEMPLATES(模板)

DATABASES(数据库)

LANGUAGE_CODE(语言 语言默认是美式英语,如果改成中文,en-us改成	zh-hans)

TIME_ZONE(时区  UTC是格林威治时间  | 上海时间==> Asia/shanghai)

USE_TZ=False

STATIC_URL(静态文件(css,js,img))

静态资源问题
目的:在django中如何配置静态文件的访问地址和文件夹

配置:

STATIC_URL:静态资源的访问路径,默认是/static/
STATICFILES_DIRS:静态资源的文件夹,并且是一个列表。
注意点:

STATICFILES_DIRS是一个列表,寻找文件的时候,从前向后依次寻找,找不到报404错误
地址匹配
目的:在浏览器访问服务器的时候,根应用的地址,子应用的地址是如何进行匹配的

格式1:基本匹配, 从上到下

格式2:匹配混乱问题, 有路由覆盖的问题, 建议用path方法

格式3:

子应用地址后面的 / 问题, 建议大家写的时候都加上
url(r’^index/$’, index)
在访问的时候,浏览器自动会定向到带有/的地址上面去,这样在访问的时候不管是否携带/,
都能访问。
路由参数名设置
目的:能够在地址中编写正则匹配

过程:

1.格式1:不指定正则匹配的名字:/hello/([a-z]+)/(\d+)

按照顺序依次匹配,传递参数

2.格式2:指定正则的名字:/hello/(?P[a-z]+)/(?P\d+)

按照名字来匹配,传递参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDqQ24fW-1601031682816)(E:\Longtan\Four seas gate\7月博客笔记\imgs\image-20200925185523373.png)]

get请求
目的:通过request对象,获取查询参数

过程:

http://xxx.com/index/?name=xxx&age=ccc&name=yyy

request.GET:是一个查询字典

request.GET.get(key) # 获取单个key,value

request.GET.getlist(key) # 获取单个key,对应的多个value,得到的是list列表。

post、put、delete请求
目的:获取request获取表单,及非表单提交的非查询参数数据

常见的请求方式有:POST,PUT,DELETE,PATCH

request.POST:获取表单数据(会把body的内容,解析一份, 解析成一个查询字典)
request.body:获取json数据
需要将bytes类型转成dict格式,用到decode(),loads()

1.拿到bodyjson数据

body_json = request.body.decode()

2. 解析json数据

body_dict = json.loads(body_data)

# 1.拿到bodyjson数据 
body_json = request.body.decode() 
# 2. 解析json数据 
body_dict = json.loads(body_data)

Post, put都需要处理请求体, delete可以没有请求体

post, 通过请求头中的content-type字段来区分格式

表单格式: name=zhangsan&age=18

json格式: ‘{“name”:“zhangsan”, “age”:18}’

python中的三种路径

操作系统文件绝对路径

django 静态文件查找,模板查找(第一种)

#去配置好的 文件夹 中查找指定的文件
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL='/static/'
#/teach/shiyanlou_project/syl/apps/user/ #linux
#E:\_000\XSX

django导包路径(第二种)

#导包之前,包的上级路径,需要存在于python system的path
#sys.path   这是一个列表
sys.path.insert(0,os.path.join(BASE_DIR,"apps"))

from xxx import yyy #才能成功

django 模型引用路径(第三种)

#想使用一个models.py文件中的模型
#apps名称.model模型名
"users.User"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个 SQL 语句,用于向借阅表中插入数据。该表包含以下字段:借阅编号、读者编号、书籍编号、借阅日期、归还日期、借阅状态。每条数据表示一次借阅记录。其中借阅编号、读者编号、书籍编号、借阅日期和借阅状态是必填项,归还日期为可选项,如果借阅状态为“已还”则必须填写归还日期。 具体插入的数据如下: - 借阅编号:100001,读者编号:123413,书籍编号:0001,借阅日期:2020-11-05,归还日期:NULL,借阅状态:借阅 - 借阅编号:100002,读者编号:223411,书籍编号:0002,借阅日期:2020-9-28,归还日期:2020-10-13,借阅状态:已还 - 借阅编号:100003,读者编号:321123,书籍编号:1001,借阅日期:2020-7-01,归还日期:NULL,借阅状态:过期 - 借阅编号:100004,读者编号:321124,书籍编号:2001,借阅日期:2020-10-09,归还日期:2020-10-14,借阅状态:已还 - 借阅编号:100005,读者编号:321124,书籍编号:0001,借阅日期:2020-10-15,归还日期:NULL,借阅状态:借阅 - 借阅编号:100006,读者编号:223411,书籍编号:2001,借阅日期:2020-10-16,归还日期:NULL,借阅状态:借阅 - 借阅编号:100007,读者编号:411111,书籍编号:1002,借阅日期:2020-9-01,归还日期:2020-9-24,借阅状态:已还 - 借阅编号:100008,读者编号:411111,书籍编号:0001,借阅日期:2020-9-25,归还日期:NULL,借阅状态:借阅 - 借阅编号:100009,读者编号:411111,书籍编号:1001,借阅日期:2020-10-08,归还日期:NULL,借阅状态:借阅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值