快速学会使用django
iword-one Lv2

下面是从零开始开发 Django 项目的完整步骤,包括环境设置项目配置Django REST framework (DRF) 的准备工作,以及跨域资源共享 (CORS) 的配置

一、环境设置

1.1 创建虚拟环境

使用 Python 的虚拟环境工具隔离项目的依赖:

1
2
python -m venv venv 
source venv/bin/activate # 在 Windows 上使用 'venv\Scripts\activate'

1.2 安装 Django 和 Django REST framework

安装 Django 和 Django REST framework(DRF):

1
pip install django djangorestframework

1.3 安装 CORS 支持库

安装 django-cors-headers 库以支持跨域资源共享 (CORS):

1
pip install django-cors-headers

1.4 保存依赖项

将依赖项保存到 requirements.txt 文件中,方便后续管理和部署:

1
pip freeze > requirements.txt

二、项目配置

2.1 创建 Django 项目

使用 Django 的命令行工具创建新的项目:

1
django-admin startproject myproject

2.2 创建 Django 应用

在项目目录下创建应用(例如 myapp):

1
2
cd myproject
python manage.py startapp myapp

Django项目目录结构

image

2.3 配置项目设置

在 settings.py 中添加应用和 DRF

1
2
3
4
5
6
INSTALLED_APPS = [
...
'rest_framework', #添加drf框架
'myapp', #添加应用
'corsheaders', # 添加 CORS 支持
]

2.4 配置中间件以启用 CORS

在 settings.py 中的 MIDDLEWARE 列表中添加 corsheaders.middleware.CorsMiddleware:

1
2
3
4
5
6
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]

2.5 配置 CORS 设置

在 settings.py 中添加 CORS 配置:

1
2
3
4
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000", # 你的前端应用 URL
"https://yourfrontenddomain.com", # 生产环境中的前端 URL
]

2.6 设置数据库(默认是 SQLite,可以根据需要修改):

1
2
3
4
5
6
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}

2.7 配置静态文件

如有必要):’DIRS’: [Path(BASE_DIR, ‘templates’)],

1
2
3
4
STATIC_URL = '/static/'
STATICFILES_DIRS=[BASE_DIR,'static']
#或者STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
#STATIC_ROOT=Path(BASE_DIR,'static')#(开发环境不需要,上一行和这一行不能指定为同一个目录)在生产环境时,运行python manage.py collectstatic,django会将所有静态文件拷贝到Static目录中。

2.8 配置媒体文件(如果需要上传文件):

1
2
MEDIA_URL = '/media/'
MEDIA_ROOT = Path(BASE_DIR, 'media')

2.9 设置语言和时区(根据需要):

1
2
3
4
5
# 将 LANGUAGE_CODE 改为中文
LANGUAGE_CODE = 'zh-hans'

# 将 TIME_ZONE 改为中国标准时间
TIME_ZONE = 'Asia/Shanghai'

2.10 准备 Django REST framework

配置 DRF,在 settings.py 中添加 DRF 的配置(如果有特定需求):

1
2
3
4
5
6
7
8
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
),
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
),
}

三、编写后端代码

3.1 创建模型

在 myapp/models.py 中定义数据模型:

1
2
3
4
5
from django.db import models

class Word(models.Model):
head_word = models.CharField(max_length=100)
data = models.JSONField()

3.2 创建序列化器

在 myapp/serializers.py 中定义序列化器:

1
2
3
4
5
6
7
from rest_framework import serializers
from .models import Word

class WordSerializer(serializers.ModelSerializer):
class Meta:
model = Word
fields = '__all__'

3.3 创建视图集

在 myapp/views.py 中定义视图集:

1
2
3
4
5
6
7
from rest_framework import viewsets
from .models import Word
from .serializers import WordSerializer

class WordViewSet(viewsets.ModelViewSet):
queryset = Word.objects.all()
serializer_class = WordSerializer

3.4 配置 URL 路由

在 myapp/urls.py 中配置应用的 URL 路由:

1
2
3
4
5
6
7
8
9
10
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import WordViewSet

router = DefaultRouter()
router.register(r'words', WordViewSet)

urlpatterns = [
path('', include(router.urls)),
]

这个配置将为 Word 模型提供以下 API 端点

  1. GET /words/:获取所有 Word 对象的列表。
  2. GET /words/{id}/:获取特定 Word 对象的详细信息。
  3. POST /words/:创建一个新的 Word 对象。
  4. PUT /words/{id}/:更新特定 Word 对象的全部字段。
  5. PATCH /words/{id}/:部分更新特定 Word 对象的字段。
  6. DELETE /words/{id}/:删除特定 Word 对象。

3.5 在项目的 myproject/urls.py 中包含应用的 URL 路由:

1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('myapp.urls')),#加入api
]

五、数据库初始化和开发

5.1 创建数据库表

执行迁移命令以创建数据库结构:

1
2
python manage.py makemigrations
python manage.py migrate

5.2 创建超级用户

创建一个超级用户来访问 Django 管理后台:

1
python manage.py createsuperuser

5.3 启动开发服务器

启动 Django 开发服务器进行本地开发和测试:

1
python manage.py runserver

通过这些步骤,你可以设置一个 Django 项目,启用Django REST framework进行API开发,并配置跨域资源共享 (CORS) 以允许来自不同源的请求。这将帮助你构建一个功能全面、跨域兼容的应用程序。

六、Django admin后台配置的常用配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#app/admin.py
from django.contrib import admin
from django.db.models.functions import Lower
from .models import Word
# Register your models here.
class WordModelAdmin(admin.ModelAdmin):
list_display = ('head_word','trans_pos','trans_desc')
list_editable = ['trans_desc']
readonly_fields = ['head_word']
search_fields = ['head_word']
list_filter = ['trans_pos']
#在admin设置排序,只影响admin界面的显示
ordering = ('head_word',)
list_per_page = 5
#若不想默认区分大小写排序,可在模型中的Meta类中修改或者在模型中指定排序
#Meta下定义排序将会影响所有通过模型生成的查询集的默认排序
class Meta:
Ordering = [Lower('head_word')]
admin.site.register(Word,WordModelAdmin)

七、其他

7.1 关于json,记住两个常用函数

json.loads 用于将 JSON 格式的字符串转换为 Python 对象

json.dumps 用于将 Python 对象转换为 JSON 格式的字符串

json.loadsjson.dumpsPythonjson 模块中的两个核心函数,用于处理 JSON 数据。它们有不同的用途:

json.loads

  1. 功能:将 JSON 格式的字符串解析为 Python 对象(如字典、列表)。
  2. 用法:
    1
    2
    3
    4
    5
    import json
    json_string = '{"name": "John", "age": 30, "city": "New York"}'
    data = json.loads(json_string)
    print(data)
    # 输出: {'name': 'John', 'age': 30, 'city': 'New York'}

json.dumps

将 Python 对象转换为 JSON 格式的 字符串
用法:

1
2
3
4
5
6
7
8
9
10
import json
data = {'name': 'John', 'age': 30, 'city': 'New York'}
json_string = json.dumps(data, indent=4, ensure_ascii=False)
print(json_string)
# 输出:
# {
# "name": "John",
# "age": 30,
# "city": "New York"
# }

参数:
obj:要转换为 JSON 的 Python 对象。
indent:用于缩进格式化输出,使 JSON 更易读。
ensure_ascii:如果为 False,则允许输出非 ASCII 字符(如中文)。

7.2 限流设置:

#限流设置 settings.py全局设置限流访问

1
2
3
4
5
6
7
8
9
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',

],
'DEFAULT_THROTTLE_RATES': {
'anon': '2/min',
'user': '10/min'
}

如果你是匿名用户,当你的每分钟请求数量累计达到2次时,你将看到如下返回信息。如果你是认证用户,你的每分钟请求数量达到10次时才会被限流。
局部设置限流

1
2
3
4
5
6
7
8
9
10
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'anon': '2/min',
'user': '10/min',
'limit_per_minute':'5/min', # 新增 'limit_per_hour': '500/hour', # 新增 }}

AnonRateThrottleUserRateThrottle类都是针对单个用户请求进行限流的,而ScopeRateThrottle类是针对不同API接口资源进行限流的,限制的是所有用户对接口的访问总数之和。使用时直接在视图类里通过throttle_scope 属性指定限流范围(scope), 然后在settings.py对不同scope设置限流频率。

例子如下所示:

1
2
3
4
5
class ArticleListView(APIView):
throttle_scope = 'article_list'

class ArticleDetailView(APIView):
throttle_scope = 'article_detail'

针对不同api接口设置不同限流频率。如下配置代表文章资源列表一天限1000次请求(所有用户访问数量之和),文章详情接口限1小时100次。

1
2
3
4
5
6
7
8
9
10
11
12
13
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',
'rest_framework.throttling.ScopedRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'anon': '2/min',
'user': '10/min',
'article_list':'1000/day', # 新增
'article_detail': '100/hour', # 新增
}
}