第一个Django项目
1.检查Python环境:Django 1.11需要Python 2.7或Python 3.4以上的版本;Django 2.0需要Python 3.4以上的版本;Django 2.1和2.2需要Python 3.5以上的版本;Django 3.0需要Python 3.6以上版本。
说明:Django框架不同版本所需的Python解释器环境,可以在Django官方文档的FAQ中找到。
可以在macOS的终端中输入下面的命令检查Python解释器版本,Windows系统可以在命令行提示符中输入python --version。
python3 --version
也可以在Python的交互式环境中执行下面的代码来查看Python解释器的版本。
```Shell
import sys
sys.version
sys.version_info
2.更新包管理工具并安装Django环境(用于创建Django项目)。
说明:在更新这个文档时,Django最新的正式版本是3.0.7,Django 3.0提供了对ASGI的支持,可以实现全双工的异步通信,但是目前的使用体验一般,所以暂时不推荐大家使用Django 3.0,下面我们安装的是Django 2.2.13版本。使用pip安装三方库和工具时,可以通过来指定安装的版本。
pip3 install -U pip
pip3 install django2.2.13
3.检查Django环境并使用django-admin命令创建Django项目(项目名称为hellodjango)。
django-admin --version
django-admin startproject hellodjango
4.用PyCharm打开创建好的Djang项目,并为其添加虚拟环境。
如上图所示,PyCharm的项目浏览器中,最顶层的文件夹hellodjango是Python项目文件夹,这个文件夹的名字并不重要,Django项目也不关心这个文件夹叫什么名字。该文件夹下有一个同名的文件夹,它是Django项目文件夹,其中包含了__init__.py、settings.py、urls.py、wsgi.py四个文件,与名为hellodjango的Django项目文件夹同级的还有一个名为manage.py 的文件,这些文件的作用如下所示:
hellodjango/init.py:空文件,告诉Python解释器这个目录应该被视为一个Python的包。
hellodjango/settings.py:Django项目的配置文件。
hellodjango/urls.py:Django项目的URL映射声明,就像是网站的“目录”。
hellodjango/wsgi.py:项目运行在WSGI兼容Web服务器上的入口文件。
manage.py: 管理Django项目的脚本程序。
说明:WSGI全称是Web服务器网关接口,维基百科上给出的解释是“为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口”。
创建虚拟环境的界面如下图所示。
pycharm-django-virtual-environment
5.安装项目依赖项。
方法一:打开PyCharm的终端,在终端中通过pip命令安装Django项目的依赖项。
说明:由于已经基于Python 3解释器环境为项目创建了虚拟环境,所以虚拟环境中的python命令对应的是Python 3的解释器,而pip命令对应的是Python 3的包管理工具。
pip install django==2.2.13
方法二:在PyCharm的偏好设置中,可以找到项目的解释器环境和已经安装的三方库,可以通过点击添加按钮来安装新的依赖项,需要提醒大家的是在安装Django依赖项时,需要指定版本号,否则将默认安装更新本文时最新的3.0.7版本。
下图展示了Django版本和Python版本的对应关系,请大家自行对号入座。
Django版本 Python版本
1.8 2.7、3.2、3.3、3.4、3.5
1.9、1.10 2.7、3.4、3.5
1.11 2.7、3.4、3.5、3.6、3.7(Django 1.11.17)
2.0 3.4、3.5、3.6、3.7
2.1 3.5、3.6、3.7
2.2 3.5、3.6、3.7、3.8(Django 2.2.8)
3.0 3.6、3.7、3.8
6.启动Django自带的服务器运行项目。
方法一:在“Run”菜单选择“Edit Configuration”,配置“Django server”运行项目(适用于专业版PyCharm)。
方法二:在“Run”菜单选择“Edit Configuration”,配置运行“Python”程序运行项目(适用于专业版和社区版PyCharm)。
方法三:在PyCharm的终端(Terminal)中通过命令运行项目(适用于专业版和社区版PyCharm)。
python manage.py runserver
7.查看运行效果。
在浏览器中输入http://127.0.0.1:8000访问我们的服务器,效果如下图所示。
说明:
刚刚启动的Django自带的服务器只能用于开发和测试环境,因为这个服务器是纯Python编写的轻量级Web服务器,不适合在生产环境中使用。
如果修改了代码,不需要为了让修改的代码生效而重新启动Django自带的服务器。但是,在添加新的项目文件时,该服务器不会自动重新加载,这个时候就得手动重启服务器。
可以在终端中通过python manage.py help命令查看Django管理脚本程序可用的命令参数。
使用python manage.py runserver启动服务器时,可以在后面添加参数来指定IP地址和端口号,默认情况下启动的服务器将运行在本机的8000端口。
在终端中运行的服务器,可以通过Ctrl+C来停止它 。通过PyCharm的“运行配置”运行的服务器直接点击窗口上的关闭按钮就可以终止服务器的运行。
不能在同一个端口上启动多个服务器,因为会导致地址的冲突(端口是对IP地址的扩展,也是计算机网络地址的一部分)。
8.修改项目的配置文件settings.py。
Django是一个支持国际化和本地化的框架,因此刚才我们看到的Django项目的默认首页也是支持国际化的,我们可以通过修改配置文件将默认语言修改为中文,时区设置为东八区。
找到修改前的配置(在settings.py文件第100行以后)。
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
修改为以下内容。
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Chongqing'
刷新刚才的页面,可以看到修改语言代码和时区之后的结果。
9.创建自己的应用
如果要开发自己的Web应用,需要先在Django项目中创建“应用”,一个Django项目可以包含一个或多个应用。
9.1.在PyCharm的终端中执行下面的命令,创建名为first的应用。
python manage.py startapp first
执行上面的命令会在当前路径下创建first目录,其目录结构如下所示:
init.py:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包。
admin.py:可以用来注册模型,用于在Django框架自带的管理后台中管理模型。
apps.py:当前应用的配置文件。
migrations:存放与模型有关的数据库迁移信息。
init.py:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包。
models.py:存放应用的数据模型(MTV中的M)。
tests.py:包含测试应用各项功能的测试类和测试函数。
views.py:处理用户HTTP请求并返回HTTP响应的函数或类(MTV中的V)。
9.2.修改应用目录下的视图文件views.py。
from django.http import HttpResponse
def show_index(request):
return HttpResponse('<h1>Hello, Django!</h1>')
9.3.修改Django项目目录下的urls.py文件,将视图函数和用户在浏览器中请求的路径对应。
from django.contrib import admin
from django.urls import path, include
from first.views import show_index
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', show_index),
]
9.4.重新运行项目,并打开浏览器中访问http://127.0.0.1:8000/hello/。
9.5.上面我们通过代码为浏览器生成了内容,但仍然是静态内容,如果要生成动态内容,可以修改views.py文件并添加如下所示的代码。
from random import sample
from django.http import HttpResponse
def show_index(request):
fruits = [
'Apple', 'Orange', 'Pitaya', 'Durian', 'Waxberry', 'Blueberry',
'Grape', 'Peach', 'Pear', 'Banana', 'Watermelon', 'Mango'
]
selected_fruits = sample(fruits, 3)
content = '<h3>今天推荐的水果是:</h3>'
content += '<hr>'
content += '<ul>'
for fruit in selected_fruits:
content += f'<li>{fruit}</li>'
content += '</ul>'
return HttpResponse(content)
9.6.刷新页面查看程序的运行结果,看看每次刷新的网页的时候,是不是可以看到不一样的内容。
10.使用模板
上面通过拼接HTML代码的方式为浏览器生成动态内容的做法在实际开发中是无能接受的,因为实际项目中的前端页面可能非常复杂,无法用这种拼接动态内容的方式来完成,这一点大家一定能够想到。为了解决这个问题,我们可以提前准备一个模板页(MTV中的T),所谓模板页就是一个带占位符和模板指令的HTML页面。
Django框架中有一个名为render的便捷函数可以来完成渲染模板的操作。所谓的渲染就是用数据替换掉模板页中的模板指令和占位符,当然这里的渲染称为后端渲染,即在服务器端完成页面的渲染再输出到浏览器中。后端渲染的做法在Web应用的访问量较大时,会让服务器承受较大的负担,所以越来越多的Web应用会选择前端渲染的方式,即服务器只提供页面所需的数据(通常是JSON格式),在浏览器中通过JavaScript代码获取这些数据并渲染页面上。关于前端渲染的内容,我们会在后续的课程中为大家讲解,目前我们使用的是通过模板页进行后端渲染的做法,具体步骤如下所示。
使用模板页的步骤如下所示。
10.1在项目目录下创建名为templates文件夹。
10.2添加模板页index.html。
说明:实际项目开发中,静态页由前端开发者提供,后端开发者需要将静态页修改为模板页,以便通过Python程序对其进行渲染,这种做法就是上面提到的后端渲染。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
<style>
#fruits {
font-size: 1.25em;
}
</style>
</head>
<body>
<h1>今天推荐的水果是:</h1>
<hr>
<ul id="fruits">
{
% for fruit in fruits %}
<li>{
{
fruit }}</li>
{
% endfor %}
</ul>
</body>
</html>
在上面的模板页中我们使用了{ { fruit }}这样的模板占位符语法,也使用了{% for %}这样的模板指令,这些都是Django模板语言(DTL)的一部分。关于模板语法和指令,大家可以看看官方文档,相信这些内容还是很容易理解的,并不需要过多的赘述,大家也可以参考官方文档了解模板指令和语法。
10.3修改views.py文件,调用render函数渲染模板页。
from random import sample
from django.shortcuts import render
def show_index(request):
fruits = [
'Apple', 'Orange', 'Pitaya', 'Durian', 'Waxberry', 'Blueberry',
'Grape', 'Peach', 'Pear', 'Banana', 'Watermelon', 'Mango'
]
selected_fruits = sample(fruits, 3)
return render(request, 'index.html', {
'fruits': selected_fruits})
全部代码展示。
#manage.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
mysite文件夹里(python文件夹)
__init__.py
#asgi.py
"""
ASGI config for mysite project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
application = get_asgi_application()
#settings.py
"""
Django settings for mysite project.
Generated by 'django-admin startproject' using Django 3.0.8.
For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '*%ijxsq5!h-@v1+l)-=5znftf=es%g2ms=txamia)u^24uti0h'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
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 = 'mysite.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'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 = 'mysite.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/3.0/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',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Chongqing'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/'
#urls.py
"""mysite URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from first.views import show_index
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/',show_index)
]
#wsgi.py
"""
WSGI config for mysite project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
application = get_wsgi_application()
first文件夹(python文件夹)
migrations文件夹(python文件夹,在first文件夹下)
__init__.py
#apps.py
from django.apps import AppConfig
class FirstConfig(AppConfig):
name = 'first'
#views.py
from django.shortcuts import render
from random import sample
def show_index(request):
fruits=['Apple','Orange','Pitaya','Durian','Waxberry','Blueberry','Grape','Peach','Pear','Banana',"Watermelon",'Mango']
selected_fruits=sample(fruits,3)
return render(request,'index.html',{
'fruits':selected_fruits})
templates普通文件夹
#index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
<style>
fruits{
font-size:1.25em;
}
</style>
</head>
<body>
<h1>今天推荐的水果有很多:</h1>
<hr>
<ul id="fruits">
{
% for fruit in fruits %}
<li>{
{
fruit}}</li>
{
% endfor %}
</ul>
</body>
</html>