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/'
创建对应目录

模板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()

浙公网安备 33010602011771号