由于在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
若当前未创建项目目录,则可以通过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
通过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虚拟环境搭建),所以可以直接在宿主机通过浏览器访问该服务地址.
通过python manage.py startapp appName
命令创建app,创建完项目层级如下:
(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
:创建apppython 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
:存放数据库迁移文件的目录 通过vagrant
的目录映射,实现本地通过pycharm进行项目开发,然后通过vagrant虚拟机环境启动服务的开发测试模式。
注意:对于本地开发环境,由于系统差异问题,无法使用虚拟机中创建的venv
目录中的虚拟环境,本地可以直接使用本地系统的python环境,或则在本地创建自己的虚拟环境也可以。
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进行开发是需要注意将apps
、ext_apps
目录mark一下,否则编辑器可能不能正确加载目录中的代码。
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为空,系统只允许通过localhost
或127.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 Templates
和jinja2.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.postgresql
、django.db.backends.mysql
、django.db.backends.sqlite3
、django.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/'
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'
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
settings.py
,重载系统用户 重载系统用户,让UserProfile生效
AUTH_USER_MODEL = 'users.UserProfile'
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'
(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
同步数据库模型
(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: .
" "")
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.
修改users/admin.py
from django.contrib import admin
from apps.users.models import UserProfile
admin.site.register(UserProfile)
python manage.py runserver 10.0.2.15:8000
http://127.0.0.1:8000/admin/