序章
DRF フレームワーク、プロセス全体: django-rest フレームワーク、rest はプラグインの名前、django プラグインの名前はrest、framework はフレームワークを意味します。DRF は Django 拡張アプリケーションとして提供されているため、既存の Django 環境を再作成することなく直接使用できます。(Django環境がない場合は、先にDjangoをインストールする環境を構築する必要があります)
Django 関連の依存関係をインストールする
- 三者ライブラリ
# 创建django骨架
django-admin startproject djangoy
- ジャンゴサービスを開始する
python manage.py runserver
これは:未適用の移行が 18 件あります。アプリ (管理者、認証、コンテンツタイプ、セッション) の移行を適用するまで、プロジェクトは正しく動作しない可能性があります。
「python manage.py merge」を実行して適用します。
プロンプトコマンドを実行します。python manage.py merge
、この機能は、モデルを変更した後に既存のデータに影響を与えることなくテーブル構造を再構築し、
再度開始することであり、エラーは見つかりません
Settings.py ファイルの分析
django-admin コマンドを使用してプロジェクトを作成すると、設定ファイルが自動的に生成され、アプリケーションの実際のニーズに応じて変更できます。
1. BASE_DIR プロジェクト パス
BASE_DIR = Path(__file__).resolve().parent.parent
2.
変数 SECRET_KEY 暗号化文字列は本質的に暗号化されたソルトであり、パスワードのリセット、フォームの送信、セッション データなど、暗号化が必要なさまざまなデータに対してハッシュ処理を実行するために使用されます。通常は、これを次の場所に保存します。システム環境変数はos.getenv(key,default=None)で取得します。
SECRET_KEY = 'django-insecure-&wzry=5&m94moji)iuu+hz%0yhw_m%e@xpdu&)w8pms)mp6un&'
3. デバッグスイッチ
DEBUG = True
4. ALLOWED_HOSTS は
、現在のサイトにアクセスできるドメイン名を構成するために使用されます。DEBUG が False に構成されている場合、これは必須項目です。すべてのドメイン名がアクセスできるようにするには、ALLOWED_HOSTS=['*'] を設定します。
ALLOWED_HOSTS = ['*']
5.
INSTALLED_APPS パラメーターは、現在のプロジェクトにロードする必要があるアプリ パッケージのパス リストを構成します。Django はデフォルトで admin (管理バックグラウンド)、auth (認可システム)、sessions (セッション システム) を追加します。プロジェクトのニーズに応じて構成を追加または削除できます。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
6. MIDDLEWARE
現在のプロジェクトにロードする必要があるミドルウェアのリスト構成。INSTALLED_APPS 変数と同様に、Django はセッションを処理するための SessionMiddleware、承認検証を処理するための AuthenticationMiddleware などのいくつかのミドルウェアもデフォルトで追加します。同様に、プロジェクトのニーズに応じて構成を追加または削除できます。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
7.
ROOT_URLCONF 変数は、Django ルーティング システムのエントリ ポイントである現在のプロジェクトのルート URL 構成をマークします
8. TEMPLATES
は、プロジェクト テンプレートの構成に使用されるリスト変数です。リスト内の各要素は辞書です。辞書テンプレートエンジンを表す
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
9. WSGI_APPLICATION
Django の組み込みサーバーが使用する WSGI アプリケーション オブジェクトへの完全な Python パス
10. DATABASES
これは、プロジェクトのデータベース構成を識別する辞書変数です。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
Django に付属の sqlite3 はアプリケーション プロジェクトのデータベースには適していないため、ここではプロジェクトのデフォルト データベースの代わりに MySQL を使用します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 配置使用的数据库引擎
'NAME': 'django_test', # 数据库的名称
'USER': 'root', # 数据库用户名
'PASSWORD': 'root', # 数据库密码
'HOST': '127.0.0.1', # 数据库服务器地址,这里使用本地开发环境
'PORT': '3306', # 数据库服务器端口号,MySQL默认为3306
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
'charset': 'utf8mb4'
}# 指定mysql语法
}
}
django が mysql データベースを導入すると、次のエラーが発生します:
django.core.Exceptions.ImproperlyConfigured: Errorloading MySQLdb module.Did
you install mysqlclient?
mysqlclient を pymysql に変更します
# 在项目同级APP目录下__init__.py中添加
import pymysql
pymysql.install_as_MySQLdb() # 使用pymysql代替mysqldb连接数据库
# 命令行输入 迁移重置数据库结构
python3 manage.py makemigrations
python3 manage.py migrate
11. AUTH_PASSWORD_VALIDATORS
Django は、デフォルトでプラグ可能をサポートするいくつかのパスワード バリデーターを提供しており、一度に複数のパスワード バリデーターを構成できます。その主な目的は、ユーザーの弱いパスワード設定を介して直接適用されることを避けることです。
12.
2 つの変数 LANGUAGE_CODE と TIME_ZONE は、それぞれプロジェクトのロケールとタイムゾーンを表します
# 修改中文和时区
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
13.
USE_I18N および USE_L10N Web サービスを構築すると、さまざまな国のユーザーにサービスを提供できるようになります。そのためには、アプリケーションが国際化とローカリゼーションをサポートする必要があります。これら 2 つのブール変数は、現在のプロジェクトで国際化機能とローカリゼーション機能を有効にする必要があるかどうかを識別します。
14. USE_TZ は
タイムゾーンの処理をマークします。これが True に設定されている場合、TIME_ZONE がどのように設定されていても、データベースに保存される時刻は UTC 時間になります。サーバーのローカル時刻が使用される場合は、コメントアウトするだけです。
15. STATIC_URL は、
現在のプロジェクト内の静的リソースの保存場所をマークするために使用されます。
16.
DEFAULT_AUTO_FIELD 主キーのデフォルトのタイプ
17. REST_FRAMEWORK
DRFフレームワーク構成の変更
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': [
"rest_framework.filters.SearchFilter",
"rest_framework.filters.OrderingFilter"
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', # 指定了url参数为page
'PAGE_SIZE': 20
}
初期化
INSTALLED_APPS に適用されるデータベース移行
manage.py の merge コマンドは、アプリケーション モデルの定義または変更をデータベースに同期するために使用されます。移行コマンドは、INSTALLED_APPS で構成されているアプリケーションのリストを確認し、アプリケーションごとに必要なデータ テーブルを順番に繰り返し作成します。
Django のデータベース移行コマンド:
python manage.py makemigrations
python manage.py migrate
今後適用されるテーブル構造定義の変更ごとに、makemigrations コマンドを再度実行する必要があり、Django はテーブル構造間の違いを記録する新しいデータベース移行ファイルを再生成します。コマンド ルールは、シリアル番号に 1 を加算することです。以前の移行ファイルの番号 (0002_xxxx、0003_xxxx など)。その後、再度migrateコマンドを実行すると、新しいマイグレーションファイルが有効になり、テーブル構造定義の変更が完了します。
Django バックグラウンドにログインするための管理者アカウントを作成する
manage.py は、スーパーユーザーを作成するための createsuperuser コマンドを提供します。
python manage.py createsuperuser --username=admin --email=youremail@xx.com
現在のコマンドを実行した後、パスワードを 2 回再入力する必要があり (必要に応じて設定)、最後に「Superuser created fully」を返し、スーパー ユーザーが正常に作成されたことを示します。
http://127.0.0.1:8000/admin にアクセスして、バックグラウンド管理ページに入ります。
アプリケーションを作成する
manage.py によって提供される startapp コマンドを使用してビデオ アプリケーション コマンドを作成します
python manage.py startapp video
# video是项目名称
DRF
- 依存関係をインストールする
- 設定ファイル構成APP
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # DRF
'SkrAuto.apps.SkrautoConfig' # 应用
]
DRF フレームワークのカプセル化スタイル
# DEMO
from rest_framework.views import APIView # 完成视图
# from rest_framework.generics import GenericAPIView # 二次封装依赖 等同于APIView
from rest_framework.response import Response # 响应数据
from rest_framework.request import Request # 请求数据
from rest_framework.serializers import Serializer # 序列化类
from rest_framework.settings import APISettings
from rest_framework.filters import SearchFilter # 查询过滤器
from rest_framework.pagination import PageNumberPagination # 分页器
from rest_framework.authentication import TokenAuthentication # auth认证
from rest_framework.permissions import IsAuthenticated # 权限认证
from rest_framework.throttling import SimpleRateThrottle # 频率
class Test(APIView):
def get(self, request, *args, **kwargs):
return Response('drf get ok')
# project urls
# django and DRF
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
# path('admin/', admin.site.urls),
path('', include("SkrAuto.urls")),
]
# 应用级视图 views
# django DEMO
class SkrAutoView(GenericAPIView):
def get(self, request):
queryset = UserInfo.objexts.all()
user_list = []
for user in queryset:
user_list.append({
"id": user.id,
"name": user.name,
"sex": user.sex,
"age": user.age,
"phone": user.phone
})
return JsonResponse(user_list, safe=False, json_dumps_params={
"ensure_ascii": False})
# return Response({'code': 200, 'msg': '请求成功'})
def post(self, request):
json_bytes = request.body
json_str = json_bytes.decode()
user_dict = json.loads(json_str)
print(user_dict["name"])
# ORM
user = UserInfo.objects.creat(
name=user_dict.get('name'),
sex=user_dict.get('sex'),
age=user_dict.get('age'),
phone=user_dict.get('phone')
)
return JsonResponse({
"id": user.id,
"name": user.name,
"sex": user.sex,
"age": user.age,
"phone": user.phone
})
def put(self, request, pk):
try:
user = UserInfo.objects.get(pk=pk)
except UserInfo.DoesNotExist:
return Response({
'code': 103, 'msg': '用户不存在'})
# 处理传参
json_bytes = request.body
json_str = json_bytes.decode()
user_dict = json.loads(json_str)
print(user_dict.get("name"))
user.name = user_dict.get("name")
user.save()
return JsonResponse({
"id": user.id,
"name": user.name,
"sex": user.sex,
"age": user.age,
"phone": user.phone
})
def delete(self, request, pk):
try:
user = UserInfo.objects.get(pk=pk)
except UserInfo.DoesNotExist:
return Response({
'code': 103, 'msg': '用户不存在'})
user.delete()
return Response({
'code': 200, 'msg': 'ok'})
# django demo2
# class SkrPostView(GenericAPIView):
#
# def __init__(self):
# super(SkrPostView, self).__init__()
# self.data = {}
#
# def post(self, request):
# c = request.data.get('a') + request.data.get('b')
# self.data['a'] = request.data.get('a')
# self.data['b'] = request.data.get('b')
# self.data['c'] = c
# return Response({'code': 200, 'data': self.data, 'msg': 'ok'})
#
#
# class SkrPutView(GenericAPIView):
#
# def __init__(self):
# super(SkrPutView, self).__init__()
# self.data = {}
#
# def put(self, request, pk):
# # c = request.data.get('a') + request.data.get('b')
# # self.data['a'] = request.data.get('a')
# # self.data['b'] = request.data.get('b')
# # self.data['c'] = c
# try:
# user = UserInfo.objects.get(pk=pk)
# except UserInfo.DoesNotExist:
# return Response({'code': 103, 'msg': '用户不存在'})
# # 参数解析
# json_bytes = request.body
# json_str = json_bytes.decode()
# user_dict = json.loads(json_str)
#
# return Response({'code': 200, 'data': self.data, 'msg': 'ok'})
# DRF DEMO
class SkrViewSet(ModelViewSet):
queryset = UserInfo.objects.all()
serializer_class = SkrSerializers
# 应用级 urls
# django demo
urlpatterns = [
# demo
# path('get/demo/', SkrAutoView.as_view()),
# path('post/demo/', SkrPostView.as_view()),
# re_path(r'get/demo/', views.SkrAutoView.as_view()),
# path('put/demo/'), SkrPutView.as_view(),
# re_path(r'^skr/$', views.SkrAutoView.as_view()), demo
# re_path(r'^skr/(?P<pk>\d+)/$', views.SkrAutoView.as_view()), demo
]
# DRF DEMO
from rest_framework.routers import DefaultRouter, SimpleRouter
from SkrAuto import views
urlpatterns = [ ]
# router = DefaultRouter()
router = SimpleRouter()
router.register(r"skr", views.SkrViewSet)
urlpatterns += router.urls
# models
# ORM模型
# serializers 序列化器 需要新建 serializers.py 文件
from rest_framework import serializers
from django.db import models
from SkrAuto.models import UserInfo
class SkrSerializers(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields = "__all__"
DRF リクエストのライフサイクル
1. APIView の as_view 関数をリクエスト
2. APIView の as_view 内で親クラス (django ネイティブ) の as_view を呼び出し、csrf 認証を無効にする 3.
親クラスの as_view のディスパッチメソッドがリクエストAPIView
4のディスパッチ、タスクの完了メソッドをビュークラスのリクエスト関数に渡して処理し、リクエストの応答結果を取得してフォアグラウンドに返す
サービス開始
# debug
python manage.py runserver
# linux 后台挂载
nohup python manage.py runserver
リクエスト例