一、Django介绍
1. Django宗旨:
Django makes it easier to build better Web apps more quickly and with less code.
2.特点:
重量级框架
提供项目工程管理的自动化脚本工具
数据库ORM支持(对象关系映射,英语:Object Relational Mapping)
模板
表单
Admin管理站点
文件管理
认证权限
session机制
缓存
3.Django学习资料
二、工程搭建
1.环境安装
1.1创建虚拟环境
mkvirtualenv django_py3_1.11 -p python3
1.2安装Django
pip install django==1.11.11
1.3复习虚拟环境和pip的命令
# 虚拟环境
mkvirtualenv # 创建虚拟环境
rmvirtualenv # 删除虚拟环境
workon # 进入虚拟环境、查看所有虚拟环境
deactivate # 退出虚拟环境
# pip
pip install # 安装依赖包
pip uninstall # 卸载依赖包
pip list # 查看已安装的依赖包
pip freeze # 冻结当前环境的依赖包
2.创建工程
在django中,项目工程目录可以借助django提供的命令帮助我们创建。
2.1创建工程的命令为:
django-admin startproject 工程名称
2.2
例如:想要在桌面的code目录中创建一个名为demo的项目工程,可执行如下命令:
cd ~/Desktop/code
django-admin startproject demo
创建成功后
与项目同名的目录,此处为demo
settings.py 是项目的整体配置文件
urls.py 是项目的URL配置文件
wsgi.py 是项目与WSGI兼容的Web服务入口
manage.py 是项目管理文件,通过他管理项目
2.3 Django默认工作在调试Debug模式下,如果增加、修改、删除文件,服务器会自动重启。
按ctrl+c停止服务器
3.创建子应用
在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程项目拆分为不同的子功能模块,各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特定功能模块时,可以将该模块代码整体复制过去,达到复用。
3.1创建
在django中,创建子应用模块目录仍然可以通过命令来操作,即
python manage.py startapp 子应用名称
例如,在刚才创建的demo工程中,想要创建一个用户子应用模板,可执行:
cd ~/Desktop/code/demo
python manage.py startapp users
执行后,可以看到工程目录中多出了一个名为users的子目录
- admin.py 文件跟网站的后台管理站点配置相关。
- apps.py 文件用于配置当前子应用的相关信息。
- migrations 目录用于存放数据库迁移历史文件。
- models.py 文件用户保存数据库模型类。
- tests.py 文件用于开发测试用例,编写单元测试。
- views.py 文件用于编写Web应用视图。
创建出来的子应用目录文件虽然被放到了工程项目目录中,但是django工程并不能立即直接使用该子应用,需要注册安装后才能使用。
在工程配置文件settings.py中,INSTALLED_APPS项保存了工程中已经注册安装的子应用,初始工程中的INSTALLED_APPS如下:
注册安装一个子应用的方法,即是将子应用的配置信息文件apps.py中的Config类添加到INSTALLED_APPS列表中。
例如,将刚创建的users子应用添加到工程中,可在INSTALLED_APPS列表中添加'users.apps.UsersConfig'。
5.创建视图
同Flask框架一样,Django也用视图来编写Web应用的业务逻辑。
Django的视图是定义在子应用的views.py中的。
5.1创建
打开刚创建的users模板,在views.py中编写视图代码。
from django.http import HttpResponse
def index(request):
"""
index视图
:param request: 包含了请求信息的请求对象
:return: 响应对象
"""
return HttpResponse("hello the world!")
说明:
视图函数的第一个参数必须定义,用于接受Django构造的包含了请求数据的HttpReqeust对象,通常名为request。
视图函数的返回值必须作为一个响应对象,不能像Flask一样直接返回一个字符串,可以将要返回的字符串数据放到一个HTTPResponse对象中。
5.2 定义路由URL
(1)在子应用中新建一个url.py文件用于保存该应用的路由。
(2)在users/urls.py文件中定义路由信息。
from django.conf.urls import url
from . import views
# urlpatterns是被django自动识别的路由列表变量
urlpatterns = [
# 每个路由信息都需要使用url函数来构造
# url(路径, 视图)
url(r'^index/$', views.index),
]
(3)在工程总路由demo/urls.py中添加子应用的路由数据。
rom django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls), # django默认包含的
# 添加
url(r'^users/', include('users.urls')),
]
- 使用include来将子应用users里的全部路由包含进工程路由中;
- r'^users/' 决定了users子应用的所有路由都已/users/开头,如我们刚定义的视图index,其最终的完整访问路径为/users/index/。
include函数除了可以传递字符串之外,也可以直接传递应用的urls模块,如
from django.conf.urls import url, include
from django.contrib import admin
import users.urls # 先导入应用的urls模块
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^users/', include('users.urls')),
url(r'^users/', include(users.urls)), # 添加应用的路由
]
6.启动运行
重新启动django程序
python manage.py runserver
在浏览器中输入网址
127.0.0.1:8000/users/index/
可看到返回的信息
6.配置、静态文件与路由
6.1配置文件
BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
6.2 DEBUG
注意:部署线上运行的Django不要运行在调试模式下,记得修改
DEBUG = Flase
6.3本地语言与时区
初始化的工程默认和时区为英语和UTC标准时区
LANGUAGE_CODE = 'en-us' # 语言
TIME_ZONE = 'UTC' # 时区
将语言和时区修改为中国大陆信息
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
6.3静态文件
(1)在项目根目录下创建static_files目录来保存静态文件。
(2)在demo/settings.py中修改静态文件的两个参数为
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static_files'),
]
6.4路由说明
6.5路由定义位置
Django的主要路由信息定义在工程同名目录下的urls.py文件中,该文件是Django解析路由的入口。
每个子应用为了保持相对独立,可以在各个子应用中定义属于自己的urls.py来保存该应用的路由。然后用主路由文件包含各应用的子路由数据。
6.6 APP应用配置
在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
AppConfig.verbose_name
属性用于设置该应用的直观可读的名字,此名字在Django提供的Admin管理站点中会显示,如
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
verbose_name = '用户管理'
7.请求与响应
请求Request
7.1请求体
请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。
可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。
Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件,如:
7.2 表单类型 Form Data
前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。
def get_body(request):
a = request.POST.get('a')
b = request.POST.get('b')
alist = request.POST.getlist('a')
print(a)
print(b)
print(alist)
return HttpResponse('OK')
重要:只要请求体的数据是表单类型,无论是哪种请求方式(POST、PUT、PATCH、DELETE),都是使用request.POST来获取请求体的表单数据。
非表单类型 Non-Form Data
非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。
例如要获取请求体中的如下JSON数据
{"a": 1, "b": 2}
可以进行如下方法操作
import json
def get_body_json(request):
json_str = request.body
json_str = json_str.decode() # python3.6 无需执行此步
req_data = json.loads(json_str)
print(req_data['a'])
print(req_data['b'])
return HttpResponse('OK')
7.3请求头
可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。
常见的请求头如:
CONTENT_LENGTH
– The length of the request body (as a string).CONTENT_TYPE
– The MIME type of the request body.HTTP_ACCEPT
– Acceptable content types for the response.HTTP_ACCEPT_ENCODING
– Acceptable encodings for the response.HTTP_ACCEPT_LANGUAGE
– Acceptable languages for the response.HTTP_HOST
– The HTTP Host header sent by the client.HTTP_REFERER
– The referring page, if any.HTTP_USER_AGENT
– The client’s user-agent string.QUERY_STRING
– The query string, as a single (unparsed) string.REMOTE_ADDR
– The IP address of the client.REMOTE_HOST
– The hostname of the client.REMOTE_USER
– The user authenticated by the Web server, if any.REQUEST_METHOD
– A string such as"GET"
or"POST"
.SERVER_NAME
– The hostname of the server.SERVER_PORT
– The port of the server (as a string).
具体使用如下:
def get_headers(request):
print(request.META['CONTENT_TYPE'])
return HttpResponse('OK')
8.响应
视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。
8.1 HttpResponse
可以使用django.http.HttpResponse来构造响应对象。
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
8.2 HttpResponse子类
Django提供了一系列HttpResponse的子类,可以快速设置状态码
- HttpResponseRedirect 301
- HttpResponsePermanentRedirect 302
- HttpResponseNotModified 304
- HttpResponseBadRequest 400
- HttpResponseNotFound 404
- HttpResponseForbidden 403
- HttpResponseNotAllowed 405
- HttpResponseGone 410
- HttpResponseServerError 500
8.3 JsonResponse
若要返回json数据,可以使用JsonResponse来构造响应对象
from django.http import JsonResponse
def demo_view(request):
return JsonResponse({'city': 'beijing', 'subject': 'python'})
8.4 redirect 重定向
from django.shortcuts import redirect
def demo_view(request):
return redirect('/index.html')
9 cookie
Cookie的特点
- Cookie以键值对的格式进行信息的存储。
- Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息。
- 当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有Cookie信息提交给网站服务器。
9.1 设置cookie
可以通过 HttpResponse对象中的set_cookie方法来设置cookie
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
- max_age 单位为秒,默认为None。如果是临时cookie,可将max_age设置为None。
def demo_view(request):
response = HttpResponse('ok')
response.set_cookie('a', 'python1') # 临时cookie
response.set_cookie('b', 'python2', max_age=3600) # 有效期一小时
return response
9.2读取cookie
可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。
def demo_view(request):
cookie1 = request.COOKIES.get('a')
print(cookie1)
return HttpResponse('OK')
10 session
10.1存储方式
在settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。
10.2数据库
存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
10.3本地缓存
存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
10.4混合存储
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
10.5 Redis
在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。
10.5.1 安装扩展
pip install django-redis
10.5.2 配置
在settings.py文件中做如下配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
10.6 Session操作
10.6.1 以键值对的格式写session
request.session['键']=值
request.session.get('键',默认值)
10.6.3
清除所有session,在存储中删除值部分。
request.session.clear()
10.6.4 清除session数据,在存储中删除session的整条数据。
request.session.flush()
10.6.5 删除session中的指定键及值,在存储中只删除某个键及对应的值。
del request.session['键']
10.6.6 设置session的有效期
request.session.set_expiry(value)