学习目标
知道MVT设计模式中MVT分别代表的含义
能够使用命令创建Django工程和子应用
知道如何在Django中定义视图及路由
理解Django路由的匹配流程
能够区分命名参数和未命名参数的区别
知道如何使用request对象获取查询字符串参数
知道如何使用request对象获取请求体数据
Django MVT
对项目进行分层的一种软件设计模式;
核心思想:分层,解耦,分离了 数据处理 和 界面显示 的代码,使得一方代码修改了不会影响到另外一方,提高程序的可扩展性和可维护性。
- M全拼为
Model
,与MVC中的M功能相同,负责和数据库交互,进行数据处理。 - V全拼为
View
,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。 - T全拼为
Template
,与MVC中的V功能相同,负责封装构造要返回的html。
项目搭建
-
项目和应用的创建 (两种方式)
- pycharm
- 命令行
django-admin startproject 项目名 python manage.py startapp 应用名
-
运行服务器
python manage.py runserver # 使用默认ip和端口 python manage.py runserver 127.0.0.1:8000 # 手动指定ip和端口
-
视图初步使用
- 定义视图(函数)
def index(request): return HttpResponse("hello django")
- 在与全局的
url.py
中配置路由
urlpatterns = [ ... # 配置路由和视图: http://127.0.0.1:8000/users/index # 参数1: 匹配url的正则表达式 # 参数2: 匹配成功后由Django框架调用的视图函数 url(r'^users/index$', views.index), ]
-
模板初步使用
-
创建模板文件
-
指定模板文件所在的目录(pycharm创建的项目默认已经指定)
# settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 指定模板文件所在的目录 'DIRS': [os.path.join(BASE_DIR, 'templates')], ... }, ]
-
在视图中通过
render
函数使用模板def index(request): context = {'name': 'python'} return render(request, 'users/index.html', context)
-
配置
常用配置项
-
BASE_DIR 默认为项目的根目录 【理解,后面项目会用到】
-
DEBUG 是否开启调试模式
- 开发阶段设置为True, 会输出项目调试信息;(开发模式,调试模式)
- 项目上线后设置为False,不会输出项目调试信息;(生产模式,上线模式)
-
语言和时区配置
LANGUAGE_CODE = 'zh-hans' # 指定为中文 TIME_ZONE = 'Asia/Shanghai' # 指定时区
-
INSTALLED_APPS:什么情况下需要注册应用?【理解,如果提示TemplateDoesNotExist知道是什么原因】
- 要根据应用中的模型类生成表
- 要用到应用中的模板
class UsersConfig(AppConfig): name = 'users'
INSTALLED_APPS = [ ... 'users.apps.UsersConfig', # 方式一 # 'users' # 方式二 ]
静态文件使用配置
静态文件: css, js, images
配置:
- STATIC_URL:访问静态文件时使用的url前缀, (使用默认值即可,不需要配置)
- STATICFILES_DIRS:配置静态文件保存在哪个目录下(配置手动配置)
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_files')]
-
在
index.html
模板中使用 图片 或js静态文件注意:django测试服务器仅在
调试模式
下支持静态文件的使用
URL配置
针对 http://127.0.0.1:8000/user/index 进行路由配置,习惯分开两部分来配置
项目的 urls.py:
urlpatterns = [
...
url(r'^users/', include('users.urls')),
]
应用的 urls.py:
urlpatterns = [
...
url(r'^index$', views.index),
]
捕获URL中的参数【重要】
http://127.0.0.1:8000/news/1/2
-
未命名参数:按位置传递
url(r'^news/(\d+)/(\d+)$', users.views.news), def news(request, a, b): return HttpResponse("显示新闻:%s %s" % (a, b))
-
命名参数:按名字传递
url(r'^news/(?P<category>\d+)/(?P<page>\d+)$', users.views.news), def news(request, category, page): return HttpResponse("显示新闻:%s %s" % (category, page))
客户端传参的几种方式
传参方式 | 示例 | 如获取参数 | 备注 |
---|---|---|---|
url路径(path) | /news/1/2 | 正则 | |
查询字符串 | /news2?category=1&page=2 | request.GET | QueryDict |
请求体:表单类型的数据 | category=1&page=2 | request.POST | QueryDict |
请求体:非表单类型的数据(json, xml) | {“category”:1,“page”:2} | request.body | bytes |
请求头 | category=1 page=2 | request.META | 字典 |
QueryDict对象
类似字典,一键可以有多个值
get
方法: 获取值
getlist
方法:获取多个值,返回列表
request.GET,request.POST 都为QueryDict类型的对象
request对象
request属性 | 说明 | 备注 |
---|---|---|
GET | 获取查询字符串参数 (与请求方式无关) | QueryDict |
POST | 获取请求体中的表单类型的数据(与请求方式有关,仅限post请求) | QueryDict |
body | 获取请求体非表单类型的数据,比如:json | bytes |
META | 获取请求头中的数据 (获取自定义属性时,需要 加前缀HTTP_, 转大写) |
字典 |
user | 当前访问的登录用户对象 |
问题1:当请求方式为 post ,是否可以通过 reqeust.GET 获取查询查询字符串参数?
可以
问题2:当请求方式为 put , 是否可以通过 request.POST 获取到请求体中的表单数据?
不可以,需要用request.body获取