Django项目模板

mac2022-06-30  21

工程化,规范化,高质量项目模板

允许任何人访问 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 # Create your views here. 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): # 序列化会走这个方法 # print("111", 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 # 序列化Book表model class BookSerializer(serializers.ModelSerializer): # book_time = serializers.DateTimeField(format="%Y-%m-%d %X") image = ImagePathField(domin="", source="pk") # 实现自定义字段 class Meta: # 元数据 model = Book # 指定model类 fields = "__all__" # 代表所有字段都序列化 # fields = ( # "price", # 这里必须有个","代表是元组 # ) class BookView(views.APIView): # CBV,对django的view进行扩充 ''' 查询数据 ''' def get(self, request): # 内部用反射来做的方法判断 book_qrueyset = Book.objects.all() # 返回一个qrueyset serializer = BookSerializer( # 实例化序列化的类 book_qrueyset.all(), # 数据库操作拿多少 many=True) # many=True返回一个列表 return response.Response({ # response.Response返回序列化后的数据 "code": 800, "data": serializer.data }) def post(self, request): # post方法进来 serializer = BookSerializer(data=request.data) # post的body里面的数据放进来 if serializer.is_valid(): # form表单的校验 instance = serializer.save() # 保存到数据库 return response.Response({ "code": 801, "data": instance.pk # 返回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() # 先获取 # print(instance) if not instance: return response.Response({ "code": 803, "data": "数据不存在" }) serializer = BookSerializer( instance=instance, data=request.data) # 将instance传过来进行检验 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 # Create your models here. class Book(models.Model): # tel = models.CharField(max_length=11) book_name = models.CharField(max_length=20) # password = models.CharField(max_length=20) # s_token = models.CharField(max_length=50) # name = models.CharField(max_length=20) # gender = models.BooleanField(default=True) 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") ]
最新回复(0)