目录
一、Django环境的安装
python环境和Django环境的安装
安装python3.6版本:官网下载python3.6安装包,安装本地,并配置环境变量
安装Django1.11.9版本:官网查看Django个版本特性
1.1 终端安装Django
在命令行终端安装Django只需在打开命令行之后输入相应的安装命令即可, 下面是真实python环境下Django的命令行安装命令
安装命令:pip3 install django==1.11.9
查看版本命令:django-admin --version
如果要在虚拟环境中安装Django ,首先要激活虚拟环境,然后再使用和真实环境相同的安装命令即可
注意:
在安装过程中如果出现安装错误, 可能是计算机需要相应的权限而普通的命令行终端没有管理员权限, 这个时候可以采用管理员命令行进行安装
1.2 pycharm可视化安装
项目设置下Project Interpreter下为python3.6版本安装
搜索Django包,并选取对应版本号,这里我们选用的是1.11.9版本的Django, 我们在开发的过程中, 要本着稳定好用, 不容易出问题的原则去选用软件、模块和框架等的版本去使用, 并不是最新版本的就是最好用的
二、Django项目的创建
2.1 在终端创建Django项目
1、指定目录下:cd 目标路径
2、创建django项目:django-admin startproject 项目名
3、进入项目目录:cd 项目名
4、启动项目:python3 manage.py runserver 127.0.0.1:8000
5、停止项目:Ctrl + c
2.2 在pycharm中创建项目
三、Django项目的项目目录说明
项目目录:包含项目最基本的一些配置
-
__init__.py: 模块的配置文件,将blog_proj文件夹变成了模块
-
settings.py: 总的配置文件
-
urls.py: url(路由)配置文件,django项目中的所有页面都需要对其配置url地址
-
wsgi.py: (web server gateway interface),服务器网关接口,python应用与web服务器直接通信的接口
-
templates: 模板文件夹,存放html文件的(页面),支持使用Django模板语言(DTL),也可以使用第三方(jinja2)
-
manage.py: 项目管理器,与项目交互的命令行工具集的入口,查看支持的所有命令python3 manage.py
下面我们对配置文件做一个简单的说明和注释, 方便大家参考
在多数难理解的配置下面 都放了相关的配置连接, 有不懂的地方,方便到官方的配置连接中查看配置说明
import os
# 项目根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 项目安全码
# 项目安全码是保证每一个创建的项目数据安全的
和下面工具集中的django.middleware.csrf.CsrfViewMiddleware 配合来保证项目的数据安全
SECRET_KEY = 'guwba1u$18=&*8kf44_u&swqb@xlwgel7n$0rs=(+f10yvz)p0'
# 调试模式,上线项目要关闭debug模式,不然后台出现异常会直接抛给前台展现给用户看
DEBUG = True
# 在上线项目中,规定只能以什么ip地址来访问django项目, 可以只设置一个ip地址, 也可以在列表中设置多个ip地址
# DEBUG = FALSE
# ALLOWED_HOSTS = ['localhost']
ALLOWED_HOSTS = []
# 项目自带的应用
# 我们创建了自己的应用就要将自定义应用添加到该配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
# 中间件
# django自带的工具集
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 在测试时 该中间件要先注释掉(在使用POST方式发送数据的时候会被禁掉)
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 配置url配件文件的根文件,执行urls.py
ROOT_URLCONF = '项目目录.urls'
# 模板,一个个html文件
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 = '项目目录.wsgi.application'
# 数据库配置
# 要配置自定义数据库去下面链接去查询详细配置
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
# sqllite3 是一个文件数据库, 很小型,用其他数据库时需要修改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# 密码认证配置
# https://docs.djangoproject.com/en/1.11/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',
},
]
# 国际化相关配置
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# 静态文件地址 (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
四、Django项目中应用的创建
Django中项目和应用分别指什么,有什么区别?
方法一: Django项目中应用的创建:
进入项目根目录
创建应用: python3 manage.py startapp app_name
去项目的settings文件添加 应用名 到INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
...
'django.contrib.staticfiles',
# 添加的自定义应用
'app',
]
方法二: 除了在命令行终端或者pycharm中的terminal中创建应用外, 我们在创建Django项目的时候,可以直接将应用也创建出来:
方法三: 在已经创建好了Django项目之后在pycharm中创建新的应用
选择有django环境的解释器创建项目
Tools -> Run manage.py Task... -> startapp app_name
正常运行项目来启动项目, 并不是执行某一个py文件
五、Django项目中的应用的目录说明
-
migrations:数据迁移(移植)模块,数据库相关, 做了数据迁移之后 ,里边会有记录, 内容都是由Django自动生成
-
migrations下的 __init__.py
-
__init__.py 项目应用的配置文件
-
admin.py: 应用的后台管理系统配置
-
apps.py: django 1.9版本后,本应用的相关配置
-
models.py:对象关系映射的类, 数据模型模块,使用ORM框架,类似于MVC模式下的Model层
-
tests.py: 自动化测试模块,可以写自动化测试脚本
-
views.py: 执行相应的逻辑代码模块(响应什么,如何响应),代码逻辑处理的主要地点,项目的大部分代码所在位置
六、Django使用的基本步骤和相关设置
启动服务
在所有的配置完成后就可以启动服务了
在终端启动服务: 在项目根目录下: python3 manage.py runserver 127.0.0.1:8888
在pycharm中启动服务只需要点击启动按钮即可
在启动按钮旁边可以选择配置服务的地址和端口等配置信息
6.1 项目响应请求
在后台相应前台的数据请求的时候
-
首先解析出路由,
-
然后根据路由配置信息,到视图文件中,匹配到相应的视图响应函数
-
由函数体代码的相关逻辑来处理数据,最后返回一个处理结果
项目中的urls.py文件中配置路由
配置路由时的url() 的参数说明:
第一个参数是正则表达式, 根据正则表达式来解析出路由
第二个参数是相应路由对应的视图响应函数的地址, 也就是该路由被哪个函数处理
第三个参数可以传入视图响应函数的参数
# 文件: 项目下 urls.py
from django.conf.urls import url
from django.contrib import admin
# 导入应用视图
import app.views as app_view
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 为指定响应函数配置url
url(r'^index/$', app_view.index),
]
路由配置好之后到应用目录中找到views视图处理文件中配置路由对应的视图响应函数
在这里要注意视图响应函数必须要有参数接收自动传入的request
关于request:
- 是一个对象,封装了浏览器提交过来的所有数据
- 自动传入, 试图响应函数必须要设置相应的形参来接收该参数
# 导入处理请求的 http相应 功能
from django.http import HttpResponse
# django中每一个请求都有一个函数来处理
# 函数的参数约定request
def index(request):
# 简单响应一个字符串
return HttpResponse('index page!')
6.1.1 GET请求的数据处理
我们在这里通过设置登录的视图响应函数来说明处理get方式的数据请求
def login(request):
if request.method == "GET":
# 获取到则返回一个值, 获取不到返回None
request.GET.get('usr')
# 获取到则返回一个值, 获取不到返回默认值PWD, 默认值不设置时返回None
request.GET.get('pwd', 'PWD')
# 获取到则返回的多个值
request.GET.getlist('stus')
6.1.2 POST请求的数据获取
POST 和GET的数据处理方式差别不大, 在判断阶段修改响应的条件就可以了
request.POST 是一个字典, 字典中放着浏览器post形式提交过来的数据
def login(request):
if request.method == "POST":
# 获得到则返回一个值, 获取不到返回None
request.POST.get('usr')
# 获得到则返回一个值, 获取不到返回默认值PWD
request.POST.get('pwd', 'PWD')
# 获得到则返回的多个值
request.POST.getlist('stus')
6.2 模板渲染
模板渲染是在视图响应函数中通过后台返回前端页面给用户的(也就是前后端不分离时的处理), 它是通过到指定的Templates(用于存放模板页面)文件中夹中,找到相应的要返回的模板页面,在函数中返回给前台的方式进行模板渲染的
-
项目下的templates文件夹用于存放模板页面,在该文件夹中新建index.html
from django.shortcuts import render
def index(request):
# 参数:请求对象request, 模板html文件, 传给前台的数据
return render(request, 'index.html')
-
模板路径配置解读
TEMPLATES = [
{
# 如果使用第三方,可以在这个地方修改模板引擎
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 模板页面默认路径:项目根路径下的templates文件夹
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
# 允许所有app均拥有自己的模板文件夹
'APP_DIRS': True,
...
},
]
6.3 第一个重定向
重定向也是视图响应函数中的返回模板页面的一种方式
from django.shortcuts import render, redirect
# / 路径渲染index.html页面
def home(request):
return render(request, 'index.html')
# /index/ 路径重定向到 / 路径,达到渲染index.html页面
def index(request):
return redirect('/')
在项目目录下的urls.py文件配置 / 路径
from django.conf.urls import url
from django.contrib import admin
# 导入应用视图
import app.views as app_view
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/$', app_view.index),
url(r'^$', app_view.home),
]
6.4 url应用移植
-
项目目录下的urls.py文件
# 导入include功能,将url配置转移到指定应用内部的自身url配置文件
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 将url配置操作交给app_test自身的urls.py来进行操作
# app-test/为app_test应用的总路径
url(r'^app-test/', include('app_test.urls')),
]
-
app_test下的urls.py文件
-
app_test是另一个新的应用
from django.conf.urls import url
from . import views
urlpatterns = [
# 1.不要直接留空,直接留空 http://localhost:8000/app-test/* 均可以访问
# 2.如果要配置index,访问的地址为 http://localhost:8000/app-test/index
# 3.配置方式:r'^index/$',不要省略 / 符号
# 4.正则是否以$标识结尾取决于该路径是否会有下一级路径
url(r'^$', views.index),
]
6.5 多应用相同模板页面冲突
app和app_test两个应用均有模板页面index.html 的时候就会出现多应用相同模板冲突的情况
# 1.在应用templates文件夹下建立与应用同名的文件夹,eg:app_text下就建立app_text
# 2.将模板创建在与应用同名的模板文件夹下
# 3.修改指定应用下views.py处理请求的render模板指向
def index(request):
# 模板指向:blog_app应用的templates下的blog_app文件夹中的index.html
return render(request, 'app_text/index.html')
6.6 静态资源的配置(重点)
什么是静态资源?
静态资源是指我们在使用Django时需要关联JavaScript的css样式文件, 导入的jQuery和Bootstrap等, 当然我们也可以通过设置相应的视图响应函数来设置页面的样式, 但是在我们在实际的生产中不能一个样式设置一个响应函数来处理, 那样我们的代码的可读性和可管理性将会变得非常差, 这个时候就需要配置这些静态资源文件
下面我们来介绍一下怎么配置静态资源
我们在配置的地方放置了官方的配置连接, 详细的配置连接可以查看连接
-
配置文件settings.py
配置文件中的 STATIC_URL = '/static/' 这里的 static不是一个文件夹, 它是静态文件的总路由, 我们在html中使用link/script 标签来关联静态文件的时候, Django是通过这个总路由来找到相应的文件的, 我们一般在配置静态文件的时候, 在项目的根目录创建一个static文件夹, 然后在static文件夹中按照分类放置相应的静态文件, 我们还可以拓展静态资源
# 静态文件地址 (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
# 在项目根目录下新建static文件夹,静态资源均放在该文件夹中
# 增加STATICFILES_DIRS配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
# 前端页面加载静态资源的路径:/static/... (...为具体在static文件夹中的路径)
-
拓展静态资源配置
# 如果要将项目根目录下source文件夹也作为静态资源路径
# STATICFILES_DIRS增加source配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'source')
]
# 前端页面加载静态资源路径依旧不变,Django会自动索引:/static/... (...为具体在source文件夹中的路径)
6.7 url正则解读
-
原生字符串
# urls.py配置路由
url(r'test', app_view.test)
# views.py设置响应函数
def test(request):
return HttpResponse('test')
# 问题:请求地址包含test均可以访问
# http://127.0.0.1:8000/test => /test | /atest | /testa | /atesta | /test/a | /test/
-
限制开头
# urls.py配置路由
url(r'^test', app_view.test)
# views.py设置响应函数
def test(request):
return HttpResponse('test')
# 问题:请求地址以test开头均可以访问
# http://127.0.0.1:8000/test => /test | /testa | /test/a | /test/
-
再限制结尾
# urls.py配置路由
url(r'^test$', app_view.test)
# views.py设置响应函数
def test(request):
return HttpResponse('test')
# 问题:只能一种方式访问
# http://127.0.0.1:8000/test => /test
# 不能以 /test/ 访问
# http://127.0.0.1:8000/test/
-
优化结尾
# urls.py配置路由
url(r'^test/$', app_view.test)
# views.py设置响应函数
def test(request):
return HttpResponse('test')
# /test 和 /test/ 均可以访问
# http://127.0.0.1:8000/test
# http://127.0.0.1:8000/test/
# 问题:不能作为应用总路由
# eg:app_test应用在项目urls.py
# url(r'^app-test/', include('app_test.urls')) 末尾不能加$,因为作为应用总目录,是有下一级,如果用$标识结尾了,就代表不能有下一级路由
-
地址捕获
# urls.py配置路由
url(r'^test/(\d+)/\d+/(\d+)/$', app_view.test)
# 对应请求路径
# http://127.0.0.1:8000/test/1/22/333/
# 对应响应函数
def test(request, arg1, arg2):
# arg1: str 1
# arg2: str 333
return HttpResponse('test')
-
小结
常规路由配置
r'^index/$'
r'^page/2/$'
应用路由配置
r'^app/'
根路由配置
r'^$'
路由配置均以 / 结尾
()中的字段会被请求响应函数捕获
限制响应函数捕获的变量名
(?P<num>[0-9]+) 响应函数参数(requset, num)
6.8 DTL 前后台数据通信
-
DTL概念
Django模板语言(Django Template Language)
-
响应函数传输数据给前端页面
# views.py
from django.shortcuts import render
def index(request):
dic_data = {'key1': value1, 'key2': value2}
return render(request, 'index.html', dic_data)
<!-- index.html -->
<body>
{{ key1 }}
{{ key2 }}
</body>
-
前端页面传输数据给响应函数
<!-- index.html -->
<body>
<a href="{% url 'run_action' 1 %}">run 1</a>
<a href="{% url 'run_action' 2 %}">run 2</a>
</body>
# views.py
from django.http import HttpResponse
def run(request, num):
if num == '1':
return HttpResponse('run 1')
if num == '2':
return HttpResponse('run 2')
return HttpResponse('404')
# urls.py
url(r'^run/(?P<num>[0-9]+)/$', run, name='run_action')
-
拓展
# 针对发生url转移的应用
# 项目urls.py
url(r'^app_test/', include('app_test.urls', namespace='app_test'))
# 应用urls.py
url(r'^index/$', index, name='index')
# 模板语法
<a href="{% url 'app_test:index' %}">test app index</a>
6.9 form表单提交数据
配置登录界面
# urls.py配置路由
url(r'^login/$', login, name='login')
# templates下新建login.html页面
# views.py设置响应函数
def login(request):
pass
前端login.html页面
使用form表单提交数据的时候action属性可以有三种写法:
第一种: 什么都不写 提交到当前页面本身
第二种:http://127.0.0.1/login/
第三种: 直接写/login/ (推荐这种写法)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" href="/static/dist/css/bootstrap.css">
<link rel="stylesheet" href="/static/css/login.css">
</head>
<body>
<div class="container">
<!-- hint:1 -->
<form action="{% url 'login' %}" method="post" class="col-md-6 col-md-offset-3">
<!-- hint:2 -->
{% csrf_token %}
<div class="form-group">
<label for="usr">用户名:</label>
<input class="form-control" type="text" id="usr" name="usr" placeholder="请输入用户名">
</div>
<div class="form-group">
<label for="pw">密码:</label>
<input class="form-control" type="password" id="pw" name="pw" placeholder="请输入密码">
</div>
<div class="form-group">
<label class="checkbox-inline">
<input name="hobbies" type="checkbox" id="inlineCheckbox1" value="basketball"> 篮球
</label>
<label class="checkbox-inline">
<input name="hobbies" type="checkbox" id="inlineCheckbox2" value="football"> 足球
</label>
<label class="checkbox-inline">
<input name="hobbies" type="checkbox" id="inlineCheckbox3" value="ping-pong"> 乒乓球
</label>
</div>
<button type="submit" class="btn btn-info col-md-12">登录</button>
</form>
</div>
</body>
</html>
<!-- hint:1 -->
<!-- action参数值:不填(向当前路径提交请求) | http://127.0.0.1:8000/login/ | /login/ | {% url 路由名 %} -->
<!-- hint:2 -->
<!-- 表单做提交需要做token的安全验证,也可以注释settings.py中间件:'django.middleware.csrf.CsrfViewMiddleware' -->
6.10 连接数据库
import pymysql
# 连接数据库
conn = pymysql.connect(host='localhost', port=3306, user='root', password='root', db='django')
# 设置游标执行sql语句
cur = conn.cursor(pymysql.cursors.DictCursor)
# cur.execute('select * from user')
cur.execute('select * from user where usr=%s and pwd=%s', [usr, pwd])
# 获取执行结果
# users = cur.fetchall() # 所有用户数据
res = cur.fetchone() # 一条用户数据