# django学习 **Repository Path**: meng_lingyun_admin/django-learning ## Basic Information - **Project Name**: django学习 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-01 - **Last Updated**: 2024-07-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Django教程 ## 1.基础 #### manage.py 项目命令行工具 包括启动项目 创建APP #### __init.py 项目初始化文件 默认不需要修改 #### asgi.py Python 异步服务器网关接口 默认不需要修改 #### settings.py 项目配置文件 项目所有配置都在这里 必须包含 - 项目路径 - 密钥配置 - 域名访问权限 ALLOWED_HOSTS:在DEBUG 为False时必须配置 不然无法启动 - App列表 INSTALLED_APPS:告诉django有哪些APP,创建自定义应用时必须配置 不然无法使用 - 中间件 - 资源文件 STATIC_URL:默认情况下是应用下的static STATICFILES_DIRS =[]:设置静态资源文件集合 STATIC_ROOT:服务器上部署项目位置(还需要使用Django的collectstatic命令配置) MEDIA_URL:MEDIA_ROOT: staitc一般是js css,这里是图片 视频等 - 模板配置 BACKEND:模板引擎 DIRS:设置模板路径 APP_DIRS:是否在APP中查找模板文件 OPTIONS:RequestContext上下文配置 - 数据库连接方式 默认支持mysql,sqlite3,oralce,postgresql 连接mysql需要安装mysqlclient - 中间件 MIDDLEWARE: 'django.middleware.security.SecurityMiddleware',内置安全机制 'django.contrib.sessions.middleware.SessionMiddleware',会话session 'django.middleware.common.CommonMiddleware',处理请求信息 'django.middleware.csrf.CsrfViewMiddleware',CSRF防护 'django.contrib.auth.middleware.AuthenticationMiddleware',内置权限用户认证 'django.contrib.messages.middleware.MessageMiddleware',内置信息提示功能 'django.middleware.clickjacking.XFrameOptionsMiddleware',防止恶意程序单击劫持 #### urls.py 项目路由设置 - 普通路由 直接路径对应文件中的方法就行 - 带参数的路由 path('blog/', helloworld.views.blog) def blog(request, id): - 正则路由 re_path('blog3/(?P<参数名>正则表达式)/(?P<参数名>正则表达式)') #### wsgi.py Python服务器网关接口 默认不需要修改 ### 创建应用 #### admin.py 默认提供admin后台管理 用作网站的后台管理 #### apps.py 应用配置文件 #### models.py 用于应用操作数据库的模型 #### tests.py 做单元测试 #### views.py 用于编写web应用视图 接收数据 处理数据 与model模型 与template模板交互 #### 应用中可以包含urls.py 但是需要使用命名空间进行区分 项目的urls.py中需要这么写 ``` path('user/', include(('user/urls', 'user'), namespace='user')), path('order/', include(('order/urls', 'order'), namespace='order')), ``` #### 应用路由反向解析reverse resolve route_url = reverse("order:index") //路由设置了name route_msg = resolve(route_url) //获取路由详细信息 ### 关联子应用 INSTALL_APP中加入子应用的方法名 ## 1.5 关于请求响应 1.5.1 HttpResponse是基础返回类型 但是也可以带参数status=200等方式转换 ``` def resp(request): return HttpResponse("Hello") def not_found(request): return HttpResponseNotFound("404") def forbidding(request): return HttpResponseForbidden("403") def bad_request(request): return HttpResponseBadRequest("400") def server_error(request): return HttpResponseServerError("500") def not_allowed(request): return HttpResponseNotAllowed("405") def json(request): return JsonResponse({"hello": "hello"}) ``` 1.5.2 也可以使用render渲染模板render(request, template_name, context, content_type, status, using) 1.5.3 重定向可以使用方法redirect() 或临时重定向HttpResponseRedirect 或永久重定向HttpResponsePermanentRedirect ``` def redirect(request): return HttpResponseRedirect("https://www.baidu.com") def permanent_redirect(request): return HttpResponsePermanentRedirect("https://www.baidu.com") 1.5.4 文件传输 文件下载StreamingHttpResponse 适用于大量二进制流传输 FileResponse适用于文件传输 def download_file1(request): file = open(file_path, mode="rb") response = HttpResponse(file) response['content-type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment; filename="manage.py"' return response def download_file2(request): file = open(file_path, mode="rb") response = StreamingHttpResponse(file) response['content-type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment; filename="manage.py"' return response def download_file3(request): file = open(file_path, mode="rb") response = FileResponse(file) response['content-type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment; filename="manage.py"' return response ``` 文件上传 ``` def upload_test(request): file = request.FILES.get("file", None) if file is not None: f = open(os.path.join("D://myfile", file.name), "wb+") for chunk in file.chunks(): f.write(chunk) f.close() return HttpResponse("文件写入完成") else: return HttpResponse("文件读取失败") ``` ## 2.数据库 python 需要配置主项目settings.py ``` DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': BASE_DIR / 'db.sqlite3', 'ENGINE': 'django.db.backends.mysql', 'NAME': 'demo', 'USERNAME': 'root', 'PASSWORD': '****', 'HOST': 'localhost', 'PORT': 3306 } } ``` 建立模型models.py 定义class ``` class BookTypeInfo(models.Model): id = models.AutoField(primary_key=True) bookTypeName = models.CharField(max_length=20) class Meta: db_table = "t_book_type_info" verbose_name = "图书类别信息" class BookInfo(models.Model): id = models.AutoField(primary_key=True) bookName = models.CharField(max_length=255) price = models.FloatField(default=0.00) publishDate = models.DateTimeField(default=datetime.now) typeInfo = models.ForeignKey(BookTypeInfo, on_delete=models.CASCADE) class Meta: db_table = "t_book_info" verbose_name = "图书信息" ``` 使用方法 生成数据库迁移文件 ``` python manage.py makemigrations your_app_name ``` 然后执行 ``` python manage.py migrate ``` 查询 推荐使用filter 尽量不使用get ``` """ 多条件查询 使用字典dict Or查询 Q() | Q() 非查询 可以使用exclude 求个数 count 去重 values(column).dictinct() 排序 降序前面加上- 分组聚合 annotate Sum求和 Avg求平均值 分页 Paginator(list, pageSize) 高级查询 模糊查询_contains= 数字大小gt lt gte lte :param request: :return: """ d = dict(id=1, price=100) # first_list = BookInfo.objects.filter(**d) # second_list = BookInfo.objects.filter(Q(id=1) | Q(price=90)) # thrid_list = BookInfo.objects.filter(~Q(price=95)) # fourth_list = BookInfo.objects.exclude(id=1) # counts = BookInfo.objects.exclude(id=1).count() # print(counts) # fourth_list = BookInfo.objects.exclude(id=1).order_by('-id') # fourth_list = BookInfo.objects.values("typeInfo").annotate(Sum("price")) # print(fourth_list) # lists = BookInfo.objects.all() # p = Paginator(lists, 2) # fourth_list = p.page(1) # fourth_list = BookInfo.objects.filter(bookName__contains="思想") fourth_list = BookInfo.objects.filter(price__lte=90) context_value = {"title": "图书列表", "bookList": fourth_list} ``` 新增 ``` def add_book(request): # request.POST.get("bookName") # request.POST.get("bookName") # request.POST.get("bookName") # request.POST.get("bookName") book = BookInfo() book.bookName = "新书籍" book.price = 23.00 book.publishDate = timezone.now() book.typeInfo_id = 1 book.save() return HttpResponse(book.id) ``` 编辑 ``` def update_book(request, path_id): book = BookInfo.objects.get(id=path_id) book.price = 55.50 book.save() return HttpResponse(path_id) ``` 删除 ``` def del_book(request, path_id): book = BookInfo.objects.get(id=path_id) book.delete() return HttpResponse(path_id) ``` 执行SQL语句 raw方式 返回的结果是特定对象 ``` BookInfo.objects.raw("SELECT * FROM t_book_info") ``` excute方式 不限定对象调用语句 ``` cursor = connection.cursor cursor.excute("") ``` 事务(执行成功则提交 执行不成功则回滚) ``` @transaction.atomic def transfer(request): try: sid = transaction.savepoint() """ 事务代码 :param request: :return: """ transaction.savepoint_commit(sid) except Exception as e: print("异常信息:", e) transaction.savepoint_rollback() ``` ## 3.web界面 ## 4.权限部分 # 学习到27 https://www.bilibili.com/video/BV14Z421z78C?p=27&spm_id_from=pageDriver&vd_source=c9470327e9169205d84678ff69464d78