创建虚拟环境——创建django项目——创建工作子项目——配置数据库连接——生成数据库表——测试项目启动
ps: 一个系统可以装多个版本的 python 解释器,但是之后用到的第三方包会很多,如果一个系统上要开发很多个python项目,那么用到的依赖包都不一样,如果都直接安装在系统环境中,那么会显的相当臃肿,再者,不同的项目可能用到的包的版本是不一样的,所以使用虚拟环境才是正解。
下面以windows为例,linux太熟悉了,懒的写。
django是自学的,下面的是看完别人的项目自己尝试了一下使用 apps 目录放应用项目(子项目),有不合理的地方被专业的开发刷到请不要见笑,我的目标只是要做一个会开发的好运维。
1、使用命令安装虚拟环境
命令行切换到要安装虚拟环境的路径,直接执行下面的命令,即可创建虚拟环境。我是在 E:\python_project\yl\venv 下面执行的此命令(Linux和windows都可以使用此命令创建)
python3 -m venv .
cd 命令切换到 Scripts 目录中,执行 activate 就会加载到虚拟环境的环境变量了。加载成功会显示 (venv)
此时使用 pip 命令安装的所有包全部会安装到虚拟环境的主目录 Lib 下
使用 pip 安装 django 和 pymysql ,django最好选择一个稳定版本,新版本有 bug
pip install django==2.2.7
pip install pymysql
二、创建django项目
等待安装完毕后,再选择一个要创建项目的位置,使用 django-admin.exe 命令创建项目
django-admin.exe startproject schaduler_works
创建完毕后,会看到一个 schaduler_works 目录
三、创建应用项目
切到 schaduler_works 目录中,手动创建一个新的目录 apps,再进入 apps 目录中,然后创建一个应用项目(也可以不在 apps 中创建,在apps中创建一般都是稍微大型的项目规划的更细致需要的)
cd schaduler_works\apps
python ../manage.py startapp workduty
创建好后,可以看到多了一个 workduty 的目录,目录结构如下。
四、配置新项目、数据库连接
打开 schaduler_works/settings.py 文件,修改如下
在 INSTALLED_APPS 中加入新创建的应用,我是在 apps 目录下创建的,所以要写成 apps.workduty
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'apps.workduty',
]
然后配置mysql连接,NAME的值是数据库的名称
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'schaduler_works',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123qwe',
}
}
在 schaduler_works/__init__.py 文件中引入 pymysql 的包,这里不写会报错的(但是我见过有的项目没写,不知道为什么,我是个运维,django这块儿也是个新手,这算是我笔记吧)
import pymysql
pymysql.install_as_MySQLdb()
五、创建 models ,使用 ORM 将数据库表同步到数据库中
在 apps\workduty\models.py 中写入要创建的数据库表结构(刷到此文章的同行不要笑话我的表结构,这是我自己练习写个小项目用的,对设计表的思想完全是空白)
from django.db import models
# Create your models here.
class work_users(models.Model):
"""值班人员动作表"""
user_id = models.AutoField(primary_key=True, help_text="用户id")
department = models.CharField(max_length=10, help_text="部门")
job = models.CharField(max_length=20, help_text="职务")
name = models.CharField(max_length=20, help_text="值班人员名字")
phone = models.CharField(max_length=11, help_text="电话")
mail = models.CharField(max_length=30, help_text="邮箱")
user_create_date = models.DateTimeField(auto_now_add=True, help_text="创建用户时间")
user_update_date = models.DateTimeField(auto_now=True, help_text="更新用户时间")
class Meta:
db_table = "work_users"
class dates(models.Model):
"""一年的日期表"""
date_id = models.AutoField(primary_key=True, help_text="排班id")
date = models.DateTimeField(help_text="日期")
week = models.IntegerField(help_text="周")
date_cn = models.CharField(max_length=20, help_text="日期,中文")
week_cn = models.CharField(max_length=5, help_text="周,中文")
class Meta:
db_table = "dates"
class schedulers_work(models.Model):
"""排班表"""
_id = models.AutoField(primary_key=True, help_text="不做逻辑使用")
date_id = models.IntegerField(help_text="排班id")
first_user_id = models.IntegerField(help_text="第一值班人,关联用户id")
tow_user_id = models.IntegerField(help_text="第二值班人,关联用户id")
class Meta:
db_table = "schedulers_work"
然后执行下面两个命令创建表到数据库中。python manage.py makemigrations 是创建数据库迁移文件,执行完此命令后,会在apps\workduty\migrations 目录中生成一个文件;python manage.py migrate是将迁移文件的表结构同步到数据库中。
python manage.py makemigrations
python manage.py migrate
ps: 如果执行 apps\workduty\migrations 时报错 AttributeError: 'str' object has no attribute 'decode' ,我修改了一个文件就没问题了,话说是 django版本的一个 bug
将这个位置的 decode 改成 encode 即可
执行完毕没有报错的话,再查看数据库,会看到表已经生成了。
六、测试django项目是否能正常启动
在 apps\workduty\views.py 文件中写个 HttpResponse 测试一下
from django.http import HttpResponse
def Index(request):
return HttpResponse("首页测试")
在管理目录 schaduler_works\urls.py 中写上路由
from django.contrib import admin
from django.urls import path
from apps.workduty import views as apps_workduty
urlpatterns = [
path('admin/', admin.site.urls),
path('', apps_workduty.Index),
]
启动 django 项目
python manage.py runserver 0.0.0.0:8000
然后在浏览器访问一把
访问到 apps/workduty 应用没有问题,那么现在基础的django目录结构规划就已经完成了。之后再有新的应用,直接创建在 apps 中即可。