Django项目完整部署

1. Django项目创建(以小说为例)

创建Django项目实例需要的设置项集合,包括数据库配置、Django 配置和应用程序配置。

django-admin startproject demo

最外层的 demo/:根目录只是你项目的容器,根目录名称对 Django 没有影响,你可以将它重命名为任何你喜欢的名称。
manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。
里面一层的目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 demo.urls).

demo/__init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
demo/settings.py:Django 项目的配置文件。
demo/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。
demo/asgi.py:作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。
demo/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。

切换到项目外层运行web服务(cd demo):

python manage.py runserver
创建应用
python manage.py startapp helloworld

migrations:用于生成数据迁移文件,通过数据迁移文件可自动在数据库里生成相应的数据表。
init.py:index文件夹的初始化文件。
admin.py:用于设置当前App的后台管理功能。
app.py:当前App的配置信息,在Django版本后自动生成,一般情况下无需更改。
models.py:定义数据库的映射类,每个类可以关联一张数据表,实现数据持久化,即MTV里面的模型(Model)。
test.py: 自动化测试的模块,用于实现单元测试。
view.py: 视图文件,处理功能业务逻辑,即MTV里面的视图(Views)。
urls:自己创建的urls.py,处理当前应用视图和链接的关系

模型更改

每改变models中的模型结构都需执行以下命令:

python manage.py makemigrations # 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate # 创建表结构

2.项目url配置

from django.contrib import admin  
from django.urls import path  
from django.urls import include  

#配置路径
urlpatterns = [  
    path('admin/', admin.site.urls),  
    path('zh/', include('zh.urls')),  #添加路径http://127.0.0.1:8000/zh/,再去zh/urls中获取地址。
]
djando项目截图

3.应用urls部署

from django.urls import path  
from . import views
#配置路由
urlpatterns = [  
    path('', views.index),  
    #前端返回story_id传给视图中get_story方法
    path('<int:story_id>/', views.get_story),  
        #前端返回story_id和chapter_id传给视图中get_chapter方法
    path('<int:story_id>/<int:chapter_id>/', views.get_chapter),  
]
4.view部署
视图响应
from django.shortcuts import render  
from django.http import HttpResponse  
from django.db import models  
from .models import Story, Chapter  
from django.views import View  

def index(request):  
	#获取Story模型全部内容
    publish_obj = Story.objects.all()  
	#给与html或数据响应,返回"zh/index.html"页面,并数据context提供html使用
    return render(request, "zh/index.html", context={"publish_obj": publish_obj})
    #返回页面响应内容
    return HttpResponse("django的第一个视图函数")  
获取数据
def testdb(request):
	# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM;返回列表 ;返回列表
	data_list = Test.objects.all()
	# filter相当于SQL中的WHERE,可设置条件过滤结果,返回列表 
	data_list = Test.objects.filter(id=2)
	# 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
	data_list = Test.objects.order_by('name')[0:2]
	# 数据排序 正序:id 倒序:-id 多字段排序:"name","id"
	data_list = Test.objects.order_by("name","id")
	# 上面的方法可以连锁使用 ;返回列表
	data_list = Test.objects.filter(id=1).order_by("id")
	# 稍稍复杂的查询 相当于id < 3
	data_list = Test.objects.filter(id__lt=3).order_by("id")
	for item in data_list:
	print(item.name)
	# 获取单个对象
	data = Test.objects.get(id=1)
	return HttpResponse("操作完成")

1、下述代码查询model对应数据库中日期等于2018-05-22的数据:

queryset = model.objects.all() 
condtions: {'date': '2018-05-22'}
query_res = queryset.filter(**condtions)

2、下述代码查询model对应数据库中日期小于2018-05-22的数据:

queryset = model.objects.all() 
condtions: {'date__lt': '2018-05-22'}
query_res = queryset.filter(**condtions)

3.总结:条件选取querySet的时候,filter表示=,exclude表示!=。

__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
querySet.distinct() 去重复

如果参数是字典,如:

condtions: {'date__lt': '2018-05-22','status': '未支付','name__exact': 'yangxia'}
 Entry.objects.filter(**condtions)
 相当于 
 Entry.objects.filter(date__lt= '2018-05-22',status='未支付',name__exact='yangxia')
#翻译成sql语句是
select * from  Entry.objects where date<='2018-05-22' and status='未支付' and name like 'yangxia'

filter例子:

>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2= q1.filter(pub_date__gte=datetime.date.today())
>>> q3= q.filter(pub_date__lte=datetime.date.today())

exclude例子:

>>> q1 = q.exclude(body_text__icontains="food")
>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
django中多个字段的模糊查询
使用Entity.objects.filter(name_contains='kris').filter(address='beijing')
这个方法是指名字包含kris,并且地址包含beijing的记录。
如果是不区分大小写,那么使用icontains替换contains.
添加数据
def testdb(request):
	#数据插入
	test = Test(name="拖把")
	#数据保存
	result = test.save()
	return HttpResponse("操作完成")
更新数据
from django.shortcuts import render
from .models import Test
from django.http import HttpResponse
def testdb(request):
	# 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
	test1 = Test.objects.get(id=1)
	test1.name = '大橘'
	test1.save()
	# 另外一种方式
	Test.objects.filter(id=2).update(name='大橘')
	# 修改所有的列
	Test.objects.all().update(name='大橘')
	data_list = Test.objects.all()
	for item in data_list:
	print(item.name)
	return HttpResponse("操作完成")
动态返回小说目录和小说内容案例
#返回所有小说
#用于引入story_id
def index(request):  
    publish_obj = Story.objects.all()  
    return render(request, "zh/index.html", context={"publish_obj": publish_obj}) #前端可从此处获取story_id用于调用视图其他方法

#返回小说名录方法
#接收urls的story_id
def get_story(request, story_id):  
	
    r = Chapter.objects.filter(story_id=story_id)  
    #查看story_id是否存在
    if r.exists():  
    #若存在向前端传送数据
        story_name = Story.objects.filter(pk=story_id).first().story_name  
        return render(request, "zh/story.html", context={"r": r, "story_name": story_name})  
  
#返回小说内容方法
#接收urls的story_id和chapter_id
def get_chapter(request, story_id, chapter_id):  
    r = Chapter.objects.filter(id=chapter_id, story_id=story_id)  
    #若story_id和chapter_id存在向前端返回内容
    if r.exists():  
        chapter_content = r.first().chapter_content  
        chapter_name = r.first().chapter_name  
        return render(request, "zh/chapter.html",  
                      context={"chapter_content": chapter_content, "chapter_name": chapter_name})

5. setting部署(连接MySQL)

数据库setting配置

创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法
我们需要手动创建一个数据库
create database 数据库名称 default charset=utf8;
然后打开 settings.py 修改:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '你的数据库名',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}

顺便改一下时区
TIME_ZONE = 'Asia/Shanghai'
使用pymysql模块连接mysql数据库,与项目同名的文件夹下的 init.py 文件中添加
import pymysql
pymysql.install_as_MySQLdb()

静态文件setting配置

查看setting文件配置
STATIC_URL = 'static/'
如果后续使用有问题修改为
STATIC_URL = '/static/'
创建对应目录

![file://C:/Users/admin/AppData/Local/Temp/.Q3UN51/1.png](file://C:/Users/admin/AppData/Local/Temp/.Q3UN51/1.png)
模板html文件中引入

<link rel="stylesheet" href="/static/helloworld/css/style.css">
<script src="/static/helloworld/js/my.js">
也可以这样引入
{% load static %}
<link rel="stylesheet" href="{% static '/helloworld/css/style.css' %}">
添加应用路由
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'testmodel',  #应用名
)

6.medeol部署(用于数据库建表)

建表
from django.db import models  
  
  
class Story(models.Model): 
	#CharField对应MySQL:verchar
    story_name = models.CharField(max_length=255)  
    story_author = models.CharField(max_length=255)  
    story_type = models.CharField(max_length=255)  
    story_state = models.CharField(max_length=255)  
    story_updata_time = models.CharField(max_length=255)  
    #CharField对应MySQL:longtext
    story_face_content = models.TextField()  
    story_updata_chapter = models.CharField(max_length=255)  
    story_img_href = models.CharField(max_length=255)  
  
  
class Chapter(models.Model):  
	#创建外键,在MySQL中会自动创建story_id
    story = models.ForeignKey("Story",on_delete=models.CASCADE)  
    chapter_name = models.CharField(max_length=255)  
    story_author = models.CharField(max_length=255)  
    chapter_word_count = models.CharField(max_length=255)  
    chapter_updata_time = models.CharField(max_length=255)  
    chapter_content = models.TextField()
posted @ 2023-06-15 19:27  向众神祈祷  阅读(1167)  评论(0)    收藏  举报