# python-django-demo **Repository Path**: miswu/python-django-demo ## Basic Information - **Project Name**: python-django-demo - **Description**: django框架学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-10-09 - **Last Updated**: 2024-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Django使用指南 ## 项目初始化操作 ```python pip3 install django # 最新版本支持的 MySQL版本 >= 8.0.11 pip3 install pymysql pip install cryptography # 获取restful风格参数的一种方案以及jwt鉴权 pip install djangorestframework # jwt鉴权 pip install djangorestframework-simplejwt pip install pyjwt ``` ## 启动项目 ```python # 方式1、terminal中执行,cd到项目根目录下,后面可指定端口,可不指定 python ./manage.py runserver 30010 # 方式2、进入到根目录下manager.py中,右键 run 即可 ``` ## 数据库连接配置 ```python # 1、在与项目相同文件夹目录下的settings.py中配置 # 修改为如下配置信息(具体的配置项值根据自己实际配置) # 如果使用的不是MySQL,是其他的PG,Oracle等,请修改ENGINE的值 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'book_system', 'USER': 'root', # 该密码是家里主机密码(修改为自己) 'PASSWORD': 'mysql@mis_wu1998', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': { # 'init_command': "SET sql_mode='STRICT_TRANS_TABLES', charset='utf8mb4'", # 'charset': 'utf8', # 'collation': 'utf8_general_ci' }, } } # 2、初始化配置(在当前文件所在目录下的 __init__.py中) import pymysql pymysql.install_as_MySQLdb() ``` ## 应用(模块)配置 ```python # 1、一个django框架项目可以有多个应用,每个应用可以有多个模块,在项目根目录下执行如下命令创建: python ./manage.py startapp book_system(应用名称) # 2、创建模块后,要记着配置(注册),在与项目同名的文件夹下的settings.py中 # 找到INSTALLED_APPS并加入自己的模块,如下:'user_auth','sys_book' 【后面要用英文逗号分割】 # 模块名不要与django已有的同名,如admin,auth,user等 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'user_auth', 'sys_book' ] ``` ## 跨域配置 ```python # 1、安装依赖 pip install django-cors-headers # 2、配置项目同名目录下的settings.py INSTALLED_APPS 中添加 'corsheaders' 模块 MIDDLEWARE 中添加 'corsheaders.middleware.CorsMiddleware' (这个配置放在CommonMiddleware上面) 继续添加如下配置: CORS_ALLOW_CREDENTIALS = True CORS_ORIGIN_ALLOW_ALL = True # True表示所有即:* ,存在安全风险,你可以指定允许的源 CORS_ALLOW_ALL_ORIGINS = True # CORS_ORIGIN_WHITELIST = [ # 'http://localhost:8085', # ] CORS_ALLOW_METHODS = ( "GET", "POST", "DELETE", "OPTIONS", "PUT", "PATCH" ) # 可使用 ['*'] CORS_ALLOW_HEADERS = [ 'accept', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', 'access-control-allow-origin', 'access-control-allow-origin-type' ] # 配置允许暴露的请求头(Content-Disposition用于文件下载) CORS_EXPOSE_HEADERS = [ 'Content-Disposition', ] ``` ## 项目请求路由配置 ```python # 1、整体配置 # 与项目名相同的文件夹下,找到urls.py文件,这个文件中配置各个app应用的路由 # 以 book开头的请求都转发到sys_book(应用)的urls下,如:http://ip:port/book/xxx urlpatterns = [ path("admin/", admin.site.urls), path("book/", include("sys_book.urls")), path("auth/", include("user_auth.urls")), ] # 2、在应用模块下【新建】 urls.py文件,里面配置这个模块的接口信息 from django.urls import path from . import views # 应用名称(命名空间)避免多个应用中存在多个相同name时无法区分 app_name = "sys_book" urlpatterns = [ path("queryBookList", views.query_book_list, name="queryBookList"), path("queryBookDetail", views.query_book_detail, name="queryBookDetail") ] # 3、具体接口实现,当前模块的views.py中,如上 queryBookList def query_book_list(request): cursor = connection.cursor() cursor.execute("select * from book_info") rows = cursor.fetchall() for row in rows: print(row[2]) books = [ { "id": 111, "name": "<<三国>>" }, { "id": 222, "name": "<<水浒>>" } ] return success_result_json(books) ``` ## 项目编码配置(避免中文乱码) ```text 1、与项目同名的文件夹目录下,settings.py中 修改如下配置: LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_TZ = True USE_L10N = True 2、设置项目文件的编码格式 点击pycharm的settings,找到Editor -> File Encodings,将编码格式都改为:UTF-8 3、设置控制台显示的编码格式 点击pycharm的settings,找到Editor -> General -> Console,将控制台的默认编码格式改为:UTF-8 ``` ## django5项目中事务控制 ### 方案一、使用装饰器 @transaction.atomic ```python from django.db import transaction from django.http import JsonResponse from .models import MyModel @transaction.atomic def create_and_delete_items(request): try: # 创建一个新对象 new_item = MyModel.objects.create(name='New Item', description='This is a new item') # 删除一个已存在的对象 existing_item = MyModel.objects.get(pk=1) existing_item.delete() return JsonResponse({'message': 'Operations completed successfully'}) except Exception as e: return JsonResponse({'error': str(e)}, status=500) ``` ### 方案二、使用上下文管理器 transaction.atomic ```python from django.db import transaction from django.http import JsonResponse from .models import MyModel def create_and_delete_items(request): try: with transaction.atomic(): # 创建一个新对象 new_item = MyModel.objects.create(name='New Item', description='This is a new item') # 删除一个已存在的对象 existing_item = MyModel.objects.get(pk=1) existing_item.delete() return JsonResponse({'message': 'Operations completed successfully'}) except Exception as e: return JsonResponse({'error': str(e)}, status=500) ``` ### 方案三、手动控制事务 ```text 在某些情况下,你可能需要更细粒度地控制事务的提交和回滚。Django 提供了 transaction.savepoint、transaction.savepoint_commit 和 transaction.savepoint_rollback 方法来实现这一点 ``` ```python from django.db import transaction from django.http import JsonResponse from .models import MyModel def create_and_delete_items(request): try: sid = transaction.savepoint() # 创建一个新对象 new_item = MyModel.objects.create(name='New Item', description='This is a new item') # 删除一个已存在的对象 existing_item = MyModel.objects.get(pk=1) existing_item.delete() # 提交事务 transaction.savepoint_commit(sid) return JsonResponse({'message': 'Operations completed successfully'}) except Exception as e: # 回滚事务 transaction.savepoint_rollback(sid) return JsonResponse({'error': str(e)}, status=500) ``` ### 方案四、使用 transaction.set_autocommit ```text 在某些情况下,你可能需要禁用自动提交,手动控制事务的提交和回滚。 ``` ```python from django.db import transaction from django.http import JsonResponse from .models import MyModel def create_and_delete_items(request): try: # 禁用自动提交 transaction.set_autocommit(False) # 创建一个新对象 new_item = MyModel.objects.create(name='New Item', description='This is a new item') # 删除一个已存在的对象 existing_item = MyModel.objects.get(pk=1) existing_item.delete() # 提交事务 transaction.commit() return JsonResponse({'message': 'Operations completed successfully'}) except Exception as e: # 回滚事务 transaction.rollback() return JsonResponse({'error': str(e)}, status=500) finally: # 恢复自动提交 transaction.set_autocommit(True) ```