主讲: 魏明择
版权: tedu.cn
时间: 2019
2005年发布,采用Python语言编写的开源框架
早期的时候Django主做新闻和内容管理的
一个重量级的 Python Web框架,Django 配备了常用的大部分组件
Django的用途
Django的版本
Django的官网
>>> import django
>>> print(django.VERSION)
(1, 11, 8, 'final', 0)
$ sudo pip3 install django # (安装django的最新版本)
$ sudo pip3 install django[==版本]
$ sudo pip3 install django==1.11.8
$ tar -xvf Django-1.11.8.tar.gz
$ cd Django-1.11.8
$ sudo python3 setup.py install
pip3 download -d /home/weimz/django_packs django
$ cd mywebsite1
$ python3 manage.py runserver
# 或
$ python3 manage.py runserver 5000 # 指定网络设备入口有端口5000
$ python3 manage.py runserver 192.168.1.111:5000 # 指定网络设备入口有端口5000
示例:
$ django-admin startproject mywebsite1
$ tree mywebsite1/
mywebsite1/
├── manage.py
└── mywebsite1
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
1 directory, 5 files
目录解析:
manage.py
包含项目管理的子命令, 如:
python3 manage.py runserver
启动服务python3 manage.py startapp
创建应用python3 manage.py migrate
数据库迁移...
__init__.py
wsgi.py
urls.py
settings.py
settings.py
文件介绍
BASE_DIR
DEBUG
调试模式
(用于开发中)生产环境中
(不启用调试)ALLOWED_HOSTS
127.0.0.1
能访问本项目INSTALLED_APPS
MIDDLEWARE
TEMPLATES
DATABASES
LANGUAGE_CODE
"zh-Hans"
TIME_ZONE
"Asia/Shanghai"
ROOT_URLCONF
ROOT_URLCONF = 'mywebsite1.urls'
import django.conf.global_settings
/usr/lib/python3/dist-packages/django/conf/global_settings.py
+--客户端1---+ request +---- 服务器 ----+
| -+-------------+-> |
| | response | |
| <-+-------------+-- |
+-----------+ | |
| |
+--客户端2---+ request | |
| -+-------------+-> |
| | response | |
| <-+-------------+-- |
+-----------+ | |
.... +---------------+
settings.py 中的ROOT_URLCONF
ROOT_URLCONF
指定顶级url的配置
urlpatterns 是一个 url() 实例的列表,如:
# file : <项目名>/urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
url() 函数
from django.conf.urls import url
'\'
不转义的原始字符串用于接收请求,处理请求并做出响应
视图处理的函数的语法格式
def xxx(request[, 其它参数...]):
return 响应对象
示例:
# file : <项目名>/urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^/', views.homepage),
url(r'^page1$', views.page1),
url(r'^page2$', views.page2),
]
# file : <项目名>/views.py
from . import views
from django.http import HttpResponse
def homepage(request):
return HttpResponse("这是首页")
def page1(request):
return HttpResponse("这是第1个页面")
def page2(request):
return HttpResponse("这是第2个页面")
练习
在视图函数内,可以用正规表达式分组()
提取参数后传送给视图函数
一个分组表示一个参数,多个参数需要使用多个分组,并且使用个/隔开
练习:
# 以下示例匹配
# http://127.0.0.1:8000/person/weimingze/35
# http://127.0.0.1:8000/person/shibowen/29
# http://127.0.0.1:8000/person/xiaowei/9
# file : <项目名>/urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^person/(?P\w+)/(?P\d{1,2})' , views.person_info),
]
# file : <项目名>/views.py
from . import views
from django.http import HttpResponse
def person_info(request, name, age):
return HttpResponse("姓名:" + name + " 年龄:" + age)
练习:定一个路由的格式为:
127.0.0.1:8000/整数/add/整数
例如:127.0.0.1:8000/10/add/20
页面显示 结果:30
url(r'^(\d+)/(\w+)/(\d+)$',view.result)
def result(request,x,y,z):
num1=int(x)
num2=int(z)
if y=='add':
result01='结果是:'+str(num1+num2)
elif y=='sub':
result01='结果是:'+str(num1-num2)
return HttpResponse(result01)
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法(最常用)
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
HTTP1.1 请求详述
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
HttpRequest对象
请求示例
# file : urls.py
from django.conf.urls import url
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^show_info', views.show_info),
]
# file : views.py
from django.http import HttpResponse
def show_info(request):
html = ''
+ "请求方式:" + request.method + ''
html += ''
+ "request.scheme:" + request.scheme + ''
html += ''
+ "request.GET:" + str(request.GET) + ''
html += ''
+ "request.POST:" + str(request.POST) + ''
html += ''
+ "request.COOKIES:" + str(request.COOKIES) + ''
html += ''
+ "request.scheme:" + request.scheme + ''
html += ''
+ "request.META:" + str(request.META) + ''
html += ''
+ "request.META['REMOTE_ADDR']:" + str(request.META['REMOTE_ADDR']) + ''
return HttpResponse(html)
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code。
下面是常见的HTTP状态码:
HTTP状态码分类
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
Django中的响应对象HttpResponse:
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
其它HttpResponse响应对象
客户端传递参数给服务器端
网址?参数名1=值1&参数名2=值2...
服务器端接收参数
if request.method == 'GET':
去往指定的模板进行显示
else:
接收其它请求提交的数据
练习:
<form method='post' action="/user/login">
姓名:<input type="text" name="username">
form>
服务器端接收参数
if request.method == 'POST':
处理POST请求的数据并响应
else:
处理非POST 请求的响应
使用post方式接收客户端数据
request.POST['参数名']
request.POST.get('参数名','')
request.POST.getlist('参数名')
取消csrf验证,否则Django将会拒绝客户端发来的表求
MIDDLEWARE = [
...
# 'django.middleware.csrf.CsrfViewMiddleware',
...
]
1. `migrations` 文件夹
- 保存数据迁移的中间文件
2. `__init__.py`
- 应用子包的初始化文件
3. `admin.py`
- 应用的后台管理配置文件
4. `apps.py`
- 应用的属性配置文件
5. `models.py`
- 与数据库相关的模型映射类文件
6. `tests.py`
- 应用的单元测试文件
7. `views.py`
- 定义视图处理函数的文件
# file : settings.py
INSTALLED_APPS = [
... ...,
'自定义应用名称'
]
INSTALLED_APPS = [
# ....
'user', # 用户信息模块
'music', # 收藏模块
]
# file : <项目名>/urls.py
from django.conf.urls import include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^music/', include('music.urls')),
url(r'^sport/',include('sport.urls')),
url(r'^news/',include('news.urls')),
]
# file : /urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# 购物车模块用到的路由
url(r'^page1', views.page1),
url(r'^page2', views.page2),
url(r'^page3', views.page3),
# ...
]
1.创建三个应用
1.创建 music 应用,并注册
2.创建 sport 应用,并注册
3.创建 news 应用,并注册
2.创建分布式路由系统
主路由配置只做分发
每个应用中处理具体访问路径和视图
1. 127.0.0.1:8000/music/index
交给 music 应用中的 index() 函数处理
2. 127.0.0.1:8000/sport/index
交给 sport 应用中的 index() 函数处理
3. 127.0.0.1:8000/news/index
交给 news 应用中的 index() 处理处理