一、常用命令:
安装Django:pip install django==2.2
#指定版本为2.2
新建项目:django-admin startproject myblog
# myblog为项目名
新建APP:python manage.py startapp App
# App为名
启动项目:python manage.py runserver
生成数据库迁移文件:python manage.py makemigrations
执行迁移:python manage.py migrate
创建超级管理员:python manage.py createsuperuser
二、Django请求处理流程:
- django获取用户发出的请求
- django在工程配置文件settings.py中通过ROOT URLCOF配置来确定根URLconf
- django在URLconf中的所有URL模式中,查找第一个匹配的条目
- 如果找到匹配,将调用相应的视图函数,并将HttpRequest对象传入
- 视图函数回一个HttpResponse响应
三、路由:
1.path对象有四个参数
- 模式串:匹配用户请求路径的字符串
- 视图函数:匹配上用户指定请求路径后调用的是视图函数名
- kwargs:可选参数,需要额外传递的参数、是一个字典
- 名称(name):给路由命名,在代码中可以用name进行反向解析(由name获取用户请求路径)
如果path中模式串不能满足路由规则,可以使用re_path对象。
re_path对象中模式串的正则表达式。
2.注意:
- django从上往下进行模式匹配,一旦匹配成功就不会往下继续匹配
- 一个视图函数可以有多个模式匹配
- 模式前面不需要加/
- 如果匹配不上,则会引起异常
3.在path中使用<参数名>表示所传参数,在视图函数在的参数名必须和<>中参数名一致。参数可以是一下类型:
- str:如果没有指定参数类型,默认是字符串类型。字符串参数可以匹配除/和空字符外的其他字符串
- int:匹配0和正整数,视图函数的参数将得到一个整型值
- slug:匹配由数字、字母、-和_组成的字符串参数
- path:匹配任何非空字符串,包括/。
4.在re_path在,()部分是正则分组,djang在进行url匹配时,就会自动把匹配成功的内容作为参数传递给视图函数。
- 位置参数:url中的正则表达式组,和视图函数中的参数一一对应,函数中的参数名可以任意指定
# 位置参数
re_path(r'^hello/(\w+)/(\d{1,2})/$', views.hello)
# 视图函数
def hello(request, value1, value2): # 参数名可以任意,但顺序不能乱
return HttpResponse('OK')
- 关键字参数:对正则表达式分组进行命名
# 关键字参数
re_path(r'^hello/(?P<name>\w+)/(?P<age>\d{1,2})/$', views.hello)
# 视图函数
def hello(request, name, age): # 参数名必须是name和age,但顺序随意
return HttpResponse('OK')
四、视图:
视图本质上是一个函数(类),这个函数第一个参数类型是HttpRequest,它返回一个HttpResponse实例。
作用:
- 响应模板
- 重定向
- 直接响应字符串
- 响应错误模板
- json数据
1.HttpRequest
视图的第一个参数必须是HttpRequest类型的对象
常用属性
- GET:一个类似于字典的QueryDict对象,包含get请求方式的所有参数
- POST:一个类似于字典的QueryDict对象, 包含post请求方式的所有参数
- COOKIES:一个标准的PYTHON字典,包含有所有cookie,键和值都是字符串
- SESSION:一个类似于字典的对象,表示当前的会话,只有当django启用会话的支持时可用
- method:一个字符串,表示请求使用的Http方法,POST,GET
2.重定向:
HttpResponseRedirect(redirect)
- 不带参数的重定向:
from django.shortcuts import HttpResponseRedirect,reverse, redirect
# urls.py
urlpatterns = [
path('', views.index),
path('^list/$', views.list_user),
]
# views.py
def index(request):
return render(request, 'index.html')
def list_user(request):
return redirect('list/')
- 带参数的重定向:
from django.shortcuts import HttpResponseRedirect,reverse, redirect
# urls.py
urlpatterns = [
path('repath/<int:num>/', views.repath),
path('list/<name>/<age>/', views.list_user),
]
# views.py
def repath(request, num):
return redirect('list/asd/1')
def list_user(request, name, age):
return HttpSponse('name={}, age={}'.format(name, age))
2.反向解析:
根据namespace和name查找真实路径
# urls.py
app_name = 'App' # 应用的命名空间
urlpatterns = [
path('', views.index, name='index'),
path('show/<name>/<int:age>/', views.show, name='show'),
re_path('^call/(\d{4}-\d{8})/$', views.call, name='cal'),
path('req/', views.req_res, name='reqres')
]
# views.py
def index(requset):
return HttpResponse('首页')
def show(request, name, age):
return HttpResponse(name + ':' + str(age))
def call(request, phone):
return HttpResponse(phone)
def req_res(request):
# return redirect(reverse('App:index')) # 不带参数
# 如果参数有名字,必须使用关键字传参
# return redirect(reverse('App:show', kwargs={'name': 'admin', 'age': 20}))
return redirect(reverse('App:cal', args=('0123-12345678',)))