Django开发总结-(四)Django项目创建

Django项目创建

1. 安装django库

​ 由于在django-cloud-music目录下已安装并配置python虚拟环境(具体操作可以参考Django开发总结-(二)Virtualenv虚拟环境搭建),所以cd到该目录下回自动进入该虚拟环境。

​ 安装django库时,可以通过-i指定通过豆瓣源进行加速下载。

[vagrant@localhost src]$ cd ~/src/djangoCloudMusic/
(venv) [vagrant@localhost djangoCloudMusic]$ pip install -i https://pypi.doubanio.com/simple/ django
Looking in indexes: https://pypi.doubanio.com/simple/
Collecting django
  Downloading https://pypi.doubanio.com/packages/c7/87/fbd666c4f87591ae25b7bb374298e8629816e87193c4099d3608ef11fab9/Django-2.1.7-py3-none-any.whl (7.3MB)
    100% |████████████████████████████████| 7.3MB 12.8MB/s
Collecting pytz (from django)
  Downloading https://pypi.doubanio.com/packages/61/28/1d3920e4d1d50b19bc5d24398a7cd85cc7b9a75a490570d5a30c57622d34/pytz-2018.9-py2.py3-none-any.whl (510kB)
    100% |████████████████████████████████| 512kB 8.8MB/s
Installing collected packages: pytz, django
Successfully installed django-2.1.7 pytz-2018.9

2. 创建django项目

​ 若当前未创建项目目录,则可以通过django-admin startproject projectName命令创建指定名称的项目

[vagrant@localhost src]$ django-admin startproject djangoCloudMusic

​ 若当前已创建项目目录,则可以通过django-admin startproject projectName projectPath命令,指定名称及根目录的项目

(venv) [vagrant@localhost djangoCloudMusic]$ django-admin startproject djangoCloudMusic ~/src/djangoCloudMusic
(venv) [vagrant@localhost djangoCloudMusic]$ ls
djangoCloudMusic  manage.py  venv

3. 启动服务

​ 通过python manage.py runserver可以启动django服务,同时可以在后面设置具体的ip与端口,由于在虚拟机中直接通过python manage.py runserver启动服务,默认为127.0.0.1:8000,只允许本机访问。

​ 为了在宿主机可以通过浏览器访问,可以通过指定ip和端口的方式启动服务。

(venv) [vagrant@localhost djangoCloudMusic]$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:a9ff:fefd:2991  prefixlen 64  scopeid 0x20<link>
        ether 02:42:a9:fd:29:91  txqueuelen 0  (Ethernet)
        RX packets 55  bytes 317013 (309.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 259  bytes 17347 (16.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::5054:ff:fe75:dc3d  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:75:dc:3d  txqueuelen 1000  (Ethernet)
        RX packets 1423  bytes 140056 (136.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 999  bytes 723397 (706.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.33.10  netmask 255.255.255.0  broadcast 192.168.33.255
        inet6 fe80::a00:27ff:fe38:d5f5  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:38:d5:f5  txqueuelen 1000  (Ethernet)
        RX packets 38  bytes 2556 (2.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 52  bytes 3422 (3.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

(venv) [vagrant@localhost djangoCloudMusic]$ python manage.py runserver 10.0.2.15:8000
Performing system checks...

System check identified no issues (0 silenced).

You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

February 28, 2019 - 13:28:51
Django version 2.1.7, using settings 'djangoCloudMusic.settings'
Starting development server at http://10.0.2.15:8000/
Quit the server with CONTROL-C.

​ 虚拟机的8000端口已经通过Vagrantfile文件配置映射到宿主机的8000端口(具体设置可以参考Django开发总结-(一)Vagrant虚拟环境搭建),所以可以直接在宿主机通过浏览器访问该服务地址.

在这里插入图片描述

4. 创建app

​ 通过python manage.py startapp appName命令创建app,创建完项目层级如下:

扫描二维码关注公众号,回复: 5892708 查看本文章
(venv) [vagrant@localhost djangoCloudMusic]$ python manage.py startapp users
(venv) [vagrant@localhost djangoCloudMusic]$ ls
db.sqlite3  djangoCloudMusic  manage.py  users  venv
(venv) [vagrant@localhost djangoCloudMusic]$ tree --filelimit 10 -I *__pycache__*
.
├── db.sqlite3
├── djangoCloudMusic
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── users
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── venv
    ├── bin [18 entries exceeds filelimit, not opening dir]
    ├── include
    │   └── python3.6m [100 entries exceeds filelimit, not opening dir]
    └── lib
        └── python3.6 [55 entries exceeds filelimit, not opening dir]

9 directories, 13 files

​ 对应文件具体作用如下:

  • manage.py:命令行工具,用于执行项目相关命令
    • python manage.py startapp xx:创建app
    • python manage.py createsuperuser:创建超级用户
    • python manage.py shell:进入django shell调试窗口
    • python manage.py loaddata xx:加载基础数据文件
    • python manage.py makemigrations:根据model生成数据库迁移文件
    • python manage.py migrate:根据上一命令创建的数据库迁移文件,同步数据库
  • settings.py:项目的配置文件
  • urls.py:项目的URL路由设置
  • wsgi.py:python服务器网关接口,是python应用于web服务器之间的接口
  • admin.py:当前app的后台管理系统配置文件
  • apps.py:当前app的配置信息
  • models.py:定义映射类关系数据库,实现数据持久化的配置文件
  • tests.py:自动化测试的脚本
  • views.py:逻辑处理模块
  • migrations:存放数据库迁移文件的目录

5. 通过pycharm实现本地项目开发

​ 通过vagrant的目录映射,实现本地通过pycharm进行项目开发,然后通过vagrant虚拟机环境启动服务的开发测试模式。

注意:对于本地开发环境,由于系统差异问题,无法使用虚拟机中创建的venv目录中的虚拟环境,本地可以直接使用本地系统的python环境,或则在本地创建自己的虚拟环境也可以。

在这里插入图片描述

6. 自定义项目app目录结构

​ django开发都是以app为单位进行开发的,所以一个项目可能会创建很多的app。

​ 为了便于管理可以自定义自己的目录层级,可以将所有的自己开发的app统一放置到根目录的apps目录下,而django相关三方库如果需要代码修改,则可以放置到根目录的ext_apps目录下。

在这里插入图片描述

在这里插入图片描述

​ 同时需要设置settings.py脚本,将这两个目录放置到环境变量中,使其可以被django识别。

import sys

sys.path.insert(0, BASE_DIR)
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0, os.path.join(BASE_DIR, 'ext_apps'))

在这里插入图片描述

注意:通过pycharm进行开发是需要注意将appsext_apps目录mark一下,否则编辑器可能不能正确加载目录中的代码。

在这里插入图片描述

7. settings.py配置说明

  • SECRET_KEY:密钥配置,是一串随机数,项目创建是自动生成,主要用于用户密码、CSRF机制、Session会话等重要数据的加密处理,提高系统的安全性。
    • 用户密码:django内置的用户管理系统中的用户密码加密;
    • CSRF机制:主要用于表单提交,防止他人窃取网站用户信息来进行恶意请求;
    • Session会话:session数据为一串随机数字符串,存放在cookies中,用于记录当前登录用户的身份信息。
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '%o6du81a@n0%40jz#%f%^4!-ongia%$=k%js(w=9if7b$e^6f)'
  • DEBUG:调试模式,为布尔类型,设置为True时表示开发调试模式,可以在开发测试过程中出现错误时,页面现实具体的错误栈信息。
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
  • ALLOWED_HOSTS:域名访问权限,当DEBUG为True时,若ALLOWED_HOSTS为空,系统只允许通过localhost127.0.0.1在浏览器上访问;当DEBUG为False时,ALLOWED_HOSTS不可为空,若想允许所有域名访问,可以设置为ALLOWED_HOSTS = ['*']
ALLOWED_HOSTS = []

  • INSTALLED_APPS:配置项目中所有的app应用,django.contrib.*为django自带的app应用。
    • django.contrib.admin:后台管理系统;
    • django.contrib.auth:用户认证系统;
    • django.contrib.contenttypes:django的ORM框架,记录项目中所有的model元数据;
    • django.contrib.sessions:session会话功能,用于当前登录用户身份识别;
    • django.contrib.messages:消息提示功能;
    • django.contrib.staticfiles:查找静态资源路径功能。
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

  • MIDDLEWARE:中间件,用于处理django的request和response对象的钩子,设置顺序是固定的,随意变更顺序很容易导致程序异常。
    • django.middleware.security.SecurityMiddleware:内置的安全机制,保护用户与网站的通讯安全;
    • django.contrib.sessions.middleware.SessionMiddleware:会话session功能;
    • django.middleware.locale.LocaleMiddleware:支持中文显示,非默认配置;
    • django.middleware.common.CommonMiddleware:处理请求信息,规范化请求内容;
    • django.middleware.csrf.CsrfViewMiddleware:开启csrf防护功能;
    • django.contrib.auth.middleware.AuthenticationMiddleware:开启内置的用户认证系统;
    • django.contrib.messages.middleware.MessageMiddleware:开启内置的信息提示功能;
    • django.middleware.clickjacking.XFrameOptionsMiddleware:防止恶意程序点击劫持。
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

  • ROOT_URLCONF:路由解析的根路径,djangoCloudMusic目录下的urls.py
ROOT_URLCONF = 'djangoCloudMusic.urls'

  • TEMPLATES:模板信息配置。
    • BACKEND:定义模板引擎,内置的模板引擎有Django Templatesjinja2.Jinja2
    • DIRS:模板所在路径,django通过该配置的路径查找模板文件;
    • APP_DIRS:是否在app里查找模板,若设置为True,则django会在app所在目录里面查找;
    • OPTIONS:传递给该模板引擎(backend)的其他参数。用于填充在RequestContext中的上下文的调用函数(callables)的元组。这些函数获取一个request对象作为它的参数,返回一个将要填充至上下文项目的字典。
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

  • WSGI_APPLICATION:wsgi应用配置。
WSGI_APPLICATION = 'djangoCloudMusic.wsgi.application'

  • DATABASES:数据库配置,可以设置多个数据库连接,默认配置为default
    • ENGINE:数据库引擎,django提供四种:django.db.backends.postgresqldjango.db.backends.mysqldjango.db.backends.sqlite3django.db.backends.oracle
    • NAME:数据库名称;
    • USER:数据库用户名;
    • PASSWORD:数据库用户密码;
    • HOST:数据库主机IP;
    • PORT:数据库监听端口
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

  • AUTH_PASSWORD_VALIDATORS:密码认证相关配置
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

  • 语言、时间等配置
    • LANGUAGE_CODE:语言设置,中国区域设置为zh-cn
    • TIME_ZONE:时区设置,中国区域设置为Asia/Shanghai
    • USE_I18N:是否开启国际化设置;
    • USE_L10N:是否开启格式化设置;
    • USE_TZ:是否开启时区设置
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

  • STATIC_URL:静态资源存放路径配置,文件夹static只能放在app里。若想在项目根目录下存放静态文件,可以通过配置STATICFILES_DIRS=(os.path.join(BASE_DIR, 'static'), )设置多个静态文件存放目录。

**注意:**还有一个静态资源配置参数STATIC_ROOT,用于实现服务器与项目之间的映射,便于项目在服务器上部署。

设置STATIC_ROOT=os.path.join(BASE_DIR, 'all_static'),并通过python manage.py collectstatic命令将所有的静态资源收集到该目录中,并由该文件夹与服务器之间构建映射关系。

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'

8. 设置本地settings.py

​ 添加app配置

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps.users',
]

​ 数据库配置,设置虚拟环境中已安装的Postgresql(安装步骤可以参考Django开发总结-(三)Docker安装Postgresql

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': '127.0.0.1',
        'PORT': '5432'
    }
}

​ 项目语言设置

LANGUAGE_CODE = 'zh-hans'

​ 时区设置

TIME_ZONE = 'Asia/Shanghai'

9. 扩展用户models

​ django中默认提供了一个用户模型,但是所含字段一般不能满足复杂开发的需求,因此需要对基础的User模型进行扩展。可以通过继承from django.contrib.auth.models import AbstractUser的方式,重新自定义设计属于自己的User模型。

  • AbstractUser:django自带User模型
    • 包含字段如下:
      • username:用户名,User模型的唯一约束;
      • password:密码;
      • first_name:名称;
      • last_name:姓氏;
      • email:邮箱;
      • is_staff:是否为职员,用于设置该用户能否登陆admin站点,默认为False;
      • is_active:是否激活,默认为True;
      • date_joined:首次登陆时间;
      • last_login:最后一次登陆时间;
      • is_superuser:是否为超级管理员;
      • groups:所属用户组;
      • user_permissions:用户权限。
    • 包含常用方法如下:
      • get_full_name:获取用户全名;
      • email_user:给该用户发送邮件;
      • is_anonymous:是否为匿名用户;
      • is_authenticated:是否已通过验证;
      • set_password:设置密码,对设置的密码进行加密,并保存;
      • check_password:校验密码是否正确;
  • UserProfile:重新定义的User模型,继承至AbstractUser。
    • 包含字段如下:
      • nickname:昵称
      • birthday:生日
      • gender:性别
      • mobile:手机号
from django.db import models
from django.contrib.auth.models import AbstractUser


class UserProfile(AbstractUser):
    """
    用户信息
    """
    GENDER_CHOICES = (
        ("male", "男"),
        ("female", "女"),
        ("secret", "保密")
    )
    nickname = models.CharField("昵称", max_length=100, null=True, blank=True, help_text="昵称")
    birthday = models.DateField("生日", null=True, blank=True, help_text="生日")
    gender = models.CharField("性别", max_length=6, choices=GENDER_CHOICES, default="female", help_text="性别")
    mobile = models.CharField("电话", max_length=11, help_text="电话")

    class Meta:
        verbose_name = "用户信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.nickname or self.username


10. 配置settings.py,重载系统用户

​ 重载系统用户,让UserProfile生效

AUTH_USER_MODEL = 'users.UserProfile'

11. 修改users/apps.py文件

​ 设置app名字,后台显示中文

from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'apps.users'
    verbose_name = "用户管理"


​ 修改users/__init__.py文件

default_app_config = 'apps.users.apps.UsersConfig'

12. 安装postgresql数据库三方库

(venv) [vagrant@localhost djangoCloudMusic]$ pip install psycopg2
Collecting psycopg2
  Downloading https://files.pythonhosted.org/packages/37/25/53e8398975aa3323de46a5cc2745aeb4c9db11352ca905d3a15c53b6a816/psycopg2-2.7.7-cp36-cp36m-manylinux1_x86_64.whl (2.7MB)
    100% |████████████████████████████████| 2.7MB 312kB/s
Installing collected packages: psycopg2
Successfully installed psycopg2-2.7.7

13. 同步数据库、创建超级用户

​ 同步数据库模型

(venv) [vagrant@localhost djangoCloudMusic]$ python manage.py makemigrations
/home/vagrant/src/djangoCloudMusic/venv/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
  """)
Migrations for 'users':
  apps/users/migrations/0001_initial.py
    - Create model UserProfile
    
(venv) [vagrant@localhost djangoCloudMusic]$ python manage.py migrate
/home/vagrant/src/djangoCloudMusic/venv/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
  """)
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, users
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying users.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying sessions.0001_initial... OK

在这里插入图片描述

​ 创建超级用户

(venv) [vagrant@localhost djangoCloudMusic]$ python manage.py createsuperuser
/home/vagrant/src/djangoCloudMusic/venv/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
  """)
用户名: admin
电子邮件地址: [email protected]
Password:
Password (again):
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

14. 注册用户models

​ 修改users/admin.py

from django.contrib import admin

from apps.users.models import UserProfile

admin.site.register(UserProfile)

15. 启动服务

python manage.py runserver 10.0.2.15:8000

16. 登陆后台admin管理系统

http://127.0.0.1:8000/admin/

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sdwang198912/article/details/88207128