Django 必会知识点
- 配置文件中的每一项
rest_framework
admin
或者Xadmin‘
的站点管理models
urls
中的写法- 单个请求
- 使用类视图
- 使用列表添加的方式
- 模板渲染
- 页面静态化
uwsgi+nginx
部署
MVC / MVT
MVC
- M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进⾏增、删、改、查操作
- V全拼为View,⽤于封装结果,⽣成⻚⾯展示的html内容
- C全拼为Controller,⽤于接收请求,处理业务逻辑,与Model和View交互,返回结果
MVT
- M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进⾏数据处理
- V全拼为View,与MVC中的C功能相同,接收请求,进⾏业务处理,返回应答
- T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html
Debug
可使用
from .base import ×
导入当前setting_base
from .base import *
"""
这里是当前项目的开发环境
"""
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app.change.apps.ChangeConfig',
'rest_framework'
]
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
- Django 仅在调试模式下(DEBUG=True)能对外提供静态⽂件
- 当DEBUG=False⼯作在⽣产模式时,Django不再对外提供静态⽂件
- 需要是⽤collectstatic命令来收集静态⽂件并交由其他静态⽂件服务器来提供
路由命名与reverse反解析(逆向)
路由命名
在定义路由的时候,可以为路由命名,⽅便查找特定视图的具体路径信息
- 在使⽤include函数定义路由时,可以使⽤namespace参数定义路由的命名空间
- 命名空间表示,凡是users.urls中定义的路由,均属于namespace指明的users名下
- 命名空间的作⽤:避免不同应⽤中的路由使⽤了相同的名字发⽣冲突,使⽤命名空间区别开
url(r'^users/', include('users.urls', namespace='users')),
- 在定义普通路由时,可以使⽤name参数指明路由的名字,如
urlpatterns = [
url(r'^index/$', views.index, name='index'),
url(r'^say', views.say, name='say'),
]
reverse反解析
- 使⽤reverse函数,可以根据路由名称,返回具体的路径
- 对于未指明namespace的,reverse(路由name)
- 对于指明namespace的,reverse(命名空间namespace:路由name)
from django.urls import reverse # 注意导包路径
def index(request):
return HttpResponse("hello the world!")
def say(request):
url = reverse('users:index') # 返回 /users/index/
print(url)
return HttpResponse('say')
路径结尾斜线/
Django中定义路由时,通常以斜线/结尾,其好处是⽤户访问不以斜线/结尾的相同路径时,Django会把⽤户重定向到以斜线/结尾的路径上,⽽不会返回404不存在
urlpatterns = [
url(r'^index/$', views.index, name='index'),
]
- ⽤户访问 index 或者 index/ ⽹址,均能访问到index视图
- 虽然路由结尾带/能带来上述好处,但是却违背了HTTP中URL表示资源位置路径的设计理念。
- 是否结尾带/以所属公司定义⻛格为准
请求与响应
Request
请求
- 未命名参数按定义顺序传递, 如
url(r'^weather/([a-z]+)/(\d{4})/$', views.weather),
def weather(request, city, year):
print('city=%s' % city)
print('year=%s' % year)
return HttpResponse('OK')
- 命名参数按名字传递,如
url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather),
def weather(request, year, city):
print('city=%s' % city)
print('year=%s' % year)
return HttpResponse('OK')
Response
响应
- HttpResponse
- content:表示返回的内容
- status_code:返回的HTTP响应状态码
from django.http import HttpResponse
def demo_view(request):
return HttpResponse('itcast python', status=400)
或者
response = HttpResponse('itcast python')
response.status_code = 400
response['Itcast'] = 'Python'
return response
- JsonResponse
- 帮助我们将数据转换为json字符串
- 设置响应头Content-Type为 application/json
from django.http import JsonResponse
def demo_view(request):
return JsonResponse({'city': 'beijing', 'subject': 'python'})
redirect
重定向
from django.shortcuts import redirect
def demo_view(request):
return redirect('/index.html')
Cookie
- Cookie以键值对的格式进⾏信息的存储
- Cookie基于域名安全,不同域名的Cookie是不能互相访问的
- 当浏览器请求某⽹站时,会将浏览器存储的跟⽹站相关的所有Cookie信息提交给⽹站服务器
- 设置Cookie
def demo_view(request):
response = HttpResponse('ok')
response.set_cookie('itcast1', 'python1') # 临时cookie
response.set_cookie('itcast2', 'python2', max_age=3600) # 有效期⼀⼩时
return response
- 读取Cookie
def demo_view(request):
cookie1 = request.COOKIES.get('itcast1')
print(cookie1)
return HttpResponse('OK')
session
配置
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"
操作
- 以键值对的格式写session:
request.session['键']=值
- 根据键读取值:
request.session.get('键',默认值)
- 清除所有session,在存储中删除值部分:
request.session.clear()
- 清除session数据,在存储中删除session的整条数据:
request.session.flush()
- 删除session中的指定键及值,在存储中只删除某个键及对应的值:
del request.session['键']
- 设置session的有效期:
request.session.set_expiry(value)
- 如果value是⼀个整数,session将在value秒没有活动后过期。
- 如果value为0,那么⽤户session的Cookie将在⽤户的浏览器关闭时过期。
- 如果value为None,那么session有效期将采⽤系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值
评论区