一、Django流程
1、具体过程
2、创建Django项目、应用、admin站点管理员用户
django-admin startproject 项目名
python manage.py startapp 应用名
python manage.py createsuperuser
3、如果创建的应用使用了models.py就需要在settings文件中的INSTALLED_APPS 中注册
4、还需要在总urls中的urlpatterns加入
path('', include('应用名.urls'))
path('', include('users.urls'))
二、Django项目Views
1、在HttpResponse中可以设置cookie
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
2、cookie的读取
cookie1 = request.COOKIES.get('bailu1')
3、获取发起请求的对象
4、通过models中的模型类查询数据
这个filter中有许多种查询方法举出个例展示
list=BookInfo.objects.filter(id__exact=1)
list=BookInfo.objects.all() #查询所有
5、常用的视图方法
1、APIView :基类
GenericAPIView(继承APIView ):增加操作序列化器和数据库查询的方法,为Mixin拓展类执行提供方法支持。
serializer_class :指明视图使用的序列化器
queryset :指明使用的数据查询集
get_object(self) :获取视图类对象
2、Mixin类:可配合GenericAPIView使用
ListModelMixin :列表视图扩展类,提供list(request, *args, **kwargs)
方法快速实现列表视图,返回200状态码。
CreateModelMixin:创建视图扩展类,提供create(request, *args, **kwargs)
方法快速实现创建资源的视图,成功返回201状态码。
RetrieveModelMixin:详情视图扩展类,提供retrieve(request, *args, **kwargs)
方法,可以快速实现返回一个存在的数据对象。
UpdateModelMixin:更新视图扩展类,提供update(request, *args, **kwargs)
方法,可以快速实现更新一个存在的数据对象。
DestroyModelMixin:删除视图扩展类,提供destroy(request, *args, **kwargs)
方法,可以快速实现删除一个存在的数据对象。
3、GenericAPIView的拓展,可直接使用
CreateAPIView:提供post 方法,继承自:GenericAPIView、CreateModelMixin
ListAPIView:提供get 方法,继承自:GenericAPIView、ListModelMixin
RetrieveAPIView:提供get 方法,继承自: GenericAPIView、RetrieveModelMixin
DestoryAPIView:提供delete 方法,继承自:GenericAPIView、DestoryModelMixin
UpdateAPIView:提供put 和patch 方法,继承自:GenericAPIView、UpdateModelMixin
RetrieveUpdateAPIView:提供get、put、patch方法,继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin
RetrieveUpdateDestoryAPIView:提供get、put、patch、delete方法,继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
4、viewset视图
ViewSet:继承自APIView与ViewSetMixin,作用也与APIView:基本类似,提供了身份认证、权限校验、流量管理等。
在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
GenericViewSet:继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。
ModelViewSet:继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
ReadOnlyModelViewSet:继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。
action属性:在视图集中,我们可以通过action对象属性来获取当前请求视图集时的action动作是哪个。
action属性的使用可实现同一种请求方法,多种处理视图。:例
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
# detail为False 表示路径名格式应该为 books/latest/
@action(methods=['get'], detail=False)
def latest(self, request):
"""
返回最新的图书信息
"""
...
# detail为True,表示路径名格式应该为 books/{pk}/read/
@action(methods=['put'], detail=True)
def read(self, request, pk):
"""
修改图书的阅读量数据
"""
...
三、Django项目urls
1、re_path可以提取urls中的数据传入views中
2、如果是Viewset视图,在添加urls是可直接
例如:
from rest_framework import routers
urlpatterns = [
...
]
router = routers.DefaultRouter()
router.register('addresses', views.AddressViewSet, basename='addresses')
urlpatterns += router.urls
四、Django项目models
1、在模型中字段常用的属性
max_length(最大长度)、min_length(最小长度)、null(是否可以为空)、default(默认值)、unique(是否唯一)、primary_key(是否为主键)
2、class Meta类
class Meta:
db_table='bookinfo' #指定BookInfo生成的数据表名为bookinfo
fields = '__all__' #选取序列化的字段
fields = ('id', 'btitle', 'bpub_date') #指定某些字段
exclude = ('image',) #排除某些字段
read_only_fields = ('id', 'bread', 'bcomment') #设置只读字段
extra_kwargs = { #设置字段的约束
'bread': {'min_value': 0, 'required': True},
'bcomment': {'min_value': 0, 'required': True},
}
verbose_name = '商品频道' #定义模型的名字
verbose_name_plural = verbose_name # 返回类的名字
五、Django项目admin
六、Django项目serializers(自己创建)
1、序列化器中校验字段常用的属性
label(别名)、read_only(只用于序列化输出使用)、write_only(只用于但序列化输入时使用)、max_length(最大长度)、min_length(最短长度)、verbose_name(别名)、required(反序列化必须输出)、many(为True表示关联对象不止一个)
七、Django项目settings
1、MySQL数据库的配置
安装命令
pip install mysqlclient
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test2', #数据库名字,
'USER': 'root', #数据库登录用户名
'PASSWORD': 'mysql', #数据库登录密码
'HOST': 'localhost', #数据库所在主机
'PORT': '3306', #数据库端口
}
}
2、DRF配置
EXCEPTION_HANDLER异常处理需要再总应用下创建文件utils,在创建exceptions.py,创建函数exception_handler(相当于对整个项目try)
# DRF配置
REST_FRAMEWORK = {
# 异常处理
'EXCEPTION_HANDLER': '项目名.utils.exceptions.exception_handler',
# 配置全局的认证方式
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # JWT认证
'rest_framework.authentication.SessionAuthentication', # 基本认证
'rest_framework.authentication.BasicAuthentication', # session认证
),
# 全局分类
'DEFAULT_PAGINATION_CLASS': '项目名.utils.pagination.StandardResultsSetPagination',
}
3、Redis配置
安装Redis包命令
pip install redis
pip install django-redis
#Redis配置
CACHES = {
"default": { # 默认
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
"session": { # session
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"# 设置存储到内存,但是使用"SESSION_CACHE_ALIAS"就被存储到Redis
SESSION_CACHE_ALIAS = "session" # 告诉session redis的别名
4、配置工程日志
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # 是否禁用已经存在的日志器
'formatters': { # 日志信息显示的格式
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
'filters': { # 对日志进行过滤
'require_debug_true': { # django在debug模式下才输出日志
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': { # 日志处理方法
'console': { # 向终端中输出日志
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': { # 向文件中输出日志
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/rongqian.log"), # 日志文件的位置
'maxBytes': 300 * 1024 * 1024,
'backupCount': 10,
'formatter': 'verbose'
},
},
'loggers': { # 日志器
'django': { # 定义了一个名为django的日志器
'handlers': ['console', 'file'], # 可以同时向终端与文件中输出日志
'propagate': True, # 是否继续传递日志信息
'level': 'INFO', # 日志器接收的最低日志级别
},
}
}
5、自定义存储位置
# fastDFS
FDFS_BASE_URL = 'http://192.168.161.130:8888/'
FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'utils/fastdfs/client.conf')
# django文件存储
DEFAULT_FILE_STORAGE = 'rongqian_site.utils.fastdfs.fdfs_storage.FastDFSStorage'
6、加入CKEditor富文本编辑框
1、先安装
pip install django-ckeditor==6.1.0
2、在配置中加入
# 富文本编辑器ckeditor配置
CKEDITOR_CONFIGS = {
'default': {
'toolbar': 'full', # 工具条功能
'height': 300, # 编辑器高度
# 'width': 300, # 编辑器宽
},
}
CKEDITOR_UPLOAD_PATH = '' # 上传图片保存路径,使用了FastDFS,所以此处设为''
7、实现搜索功能
开源的 Elasticsearch 是目前全文搜索引擎的首选。
它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。
Elasticsearch 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
Elasticsearch 是用Java实现的。
Elasticsearch 不支持对中文进行分词建立索引,需要配合扩展elasticsearch-analysis-ik来实现中文分词处理。
1、安装
pip install drf-haystack
pip install elasticsearch==2.4.1
2.配置
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://192.168.225.128:9200/', # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
'INDEX_NAME': 'rongqian', # 指定elasticsearch建立的索引库的名称
},
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
3、在templates目录中创建text字段使用的模板文件,定义搜索范围
{{ object.name }}
{{ object.caption }}
{{ object.id }}
八、Django REST framework设计风格
1、后端常用APi接口设计
请求方法 | 请求地址 | 后端操作 |
---|---|---|
GET | /goods | 获取所有商品 |
POST | /goods | 增加商品 |
GET | /goods/1 | 获取编号为1的商品 |
PUT | /goods/1 | 修改编号为1的商品 |
DELETE | /goods/1 | 删除编号为1的商品 |