工程化,规范化,高质量项目模板
允许任何人访问
ALLOWED_HOSTS = ["*"] # 允许任何人访问
日志级别
DEBUG = True # 开表示可以看见日志,上线时要关了
数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "AXF",
"USER": "root",
"PASSWORD": "",
"HOST": "localhost",
"POST": "3306",
}
}
Cache配置
CACHES = {
'default': {
"BACKEND": "django.core.cache.backends.db.DatabaseCache",
"LOCATION": "my_cache_table",
"TIMEOUT": 60 * 5
},
"redis": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
给了两个缓存,用户可以自己选择
语言时区
LANGUAGE_CODE = 'zh-hans' # 汉语
TIME_ZONE = 'Asia/Shanghai' # 上海时间
USE_I18N = True
USE_L10N = True
USE_TZ = False # 时区
mysql引擎
import pymysql
pymysql.install_as_MySQLdb() # 切换引擎
静态文件配置
STATICFILES_DIRS = {
os.path.join(BASE_DIR, "static")
}
上传文件配置
MEDIA_ROOT = os.path.join(BASE_DIR, "static/uploads")
Django2.x版本对应的多个app写法
urlpatterns = [
path('admin/', admin.site.urls),
path('axf/', include(("AXF.urls", "AXF"), namespace="axf")),
]
namespace在后面的页面跳转中很重要,前面要给个元组
创建的app中写对应的urls
urlpatterns = [
url(r"^index$", views.index, name="index")
]
给每个路由一个命名空间,彼此隔离,方便将来调试
迁移文件
python manage.py makemigrations
python manage.py migrate
最后起项目
python manage.py runserver 8888
8888端口起项目
浏览器测试:http://127.0.0.1:8888/axf/index
断言:返回Hello Django
项目标准文件格式
并不是最完整的文件格式,依赖需求文件,uwsgi.ini文件,dockerfile文件,jenkinsfile文件等后续需要自己补充
项目准备
一般都用CDN资源 因为放在自己的服务器中会消耗资源,用人家的CDN资源会减少自己服务器的压力也会有更好的体验先导入jq(推荐用1.几版本),再导入bootstrap3.几 swiper3.几(选择swiper.jquery.js)前端基础架构:导入通用资源reset.css前端适配:推荐百分比适配单位:px em(相对单位,相对于父级元素,默认为1em=16px)rem:相对单位(相对于根基元素, 默认大小1rem=16px)弹性盒模型响应式布局栅格系统屏幕宽度的十分之一作为rem的基础单位
DRF增删改查
先pip install下在app里面配置定义url分发,urlpatterns include()里面可以传列表,都在本页写
进到CBV 里面进行反射匹配
qs=obj.all()拿到qrueyset
将Bookserializer 将要序列化的数据放进去many=true代表要序列化单条数据还是多条数据,返回值是一个序列化后的数据,
.data属性可以拿到里面的内容
request不是Django中的request,是drf中重新自己写的request
在Bookserializer 里面data=request.data获取到的是提交上来的body里面的数据进行save
save后会返回本身,可以拿到pk属性
response.Response这么进行返回数据
mdoel在Bookserializer 里面做了映射关系
分别对model进行序列化,在里面可以进行添加字段
在里面进行class Meta:定义元数据,有model属性和fields属性对应model里面的字段 __all__是全部都拿到
put更新操作先获取实例
static文件引入的方式 https://www.cnblogs.com/yangxiaolan/p/5826661.html
a = 2 isinstance(a,int) # 结果返回 True
Python中的 isinstance() 函数,是Python中的一个内置函数,用来判断一个函数是否是一个已知的类型,类似 type()
is_valid()
表单校验 https://blog.csdn.net/weixin_43819222/article/details/94176820https://www.cnblogs.com/sch01ar/p/11498962.htmlhttps://blog.csdn.net/andiao1218/article/details/101192256序列化层获取字段的四种方式
view
from django
.http
import HttpResponse
from django
.shortcuts
import render
from rest_framework
import views
, response
from rest_framework
import serializers
from AXF
.models
import Book
'''
慢既是快
'''
class ImagePathField(serializers
.FileField
):
def __init__(self
, domin
, *args
, **kwargs
):
self
.domin
= domin
super(ImagePathField
, self
).__init__
(*args
, **kwargs
)
def to_representation(self
, value
):
if not self
.domin
:
self
.domin
= "www.bilibili.com"
return "{}/{}.png".format(self
.domin
, value
)
def to_internal_value(self
, data
):
print("222", data
)
return data
class BookSerializer(serializers
.ModelSerializer
):
image
= ImagePathField
(domin
="", source
="pk")
class Meta:
model
= Book
fields
= "__all__"
class BookView(views
.APIView
):
'''
查询数据
'''
def get(self
, request
):
book_qrueyset
= Book
.objects
.all()
serializer
= BookSerializer
(
book_qrueyset
.all(),
many
=True)
return response
.Response
({
"code": 800,
"data": serializer
.data
})
def post(self
, request
):
serializer
= BookSerializer
(data
=request
.data
)
if serializer
.is_valid
():
instance
= serializer
.save
()
return response
.Response
({
"code": 801,
"data": instance
.pk
})
else:
return response
.Response
({
"code": 802,
"data": serializer
.errors
})
def index(request
):
return HttpResponse
("Hello Django")
class BookDetailView(views
.APIView
):
def put(self
, request
, pk
):
instance
= Book
.objects
.filter(pk
=pk
).first
()
if not instance
:
return response
.Response
({
"code": 803,
"data": "数据不存在"
})
serializer
= BookSerializer
(
instance
=instance
,
data
=request
.data
)
if serializer
.is_valid
():
instance
= serializer
.save
()
return response
.Response
({
"code": 804,
"data": instance
.pk
})
else:
return response
.Response
({
"code": 805,
"data": serializer
.errors
})
def delete(self
, request
, pk
):
instance
= Book
.objects
.filter(pk
=pk
).delete
()
return response
.Response
({
"code": 808,
"data": "success"
})
model
from django
.db
import models
class Book(models
.Model
):
book_name
= models
.CharField
(max_length
=20)
price
= models
.IntegerField
(null
=True)
book_time
= models
.CharField
(max_length
=20)
book_zuozhe
= models
.CharField
(max_length
=20)
book_num
= models
.IntegerField
(null
=True)
urls
from django
.conf
.urls
import url
from AXF
import views
urlpatterns
= [
url
(r
"^index$", views
.index
, name
="index"),
url
(r
"^book$", views
.BookView
.as_view
(), name
="book"),
url
(r
"^book_del/(?P<pk>\d+)/$", views
.BookDetailView
.as_view
(), name
="book_del")
]