Django 基础
1. Django 基础介绍
1-1 web框架介绍
Web框架程序的意义:
用于搭建Web应用程序
免去不同Web应用相同代码部分的重复编写,只需关心Web应用核心的业务逻辑实现
Web应用程序的本质:
接收并解析HTTP请求,获取具体的请求信息
处理本次HTTP请求,即完成本次请求的业务逻辑处理
构造并返回处理结果——HTTP响应
1-2 Django框架介绍
特点
1. 重量级框架
对比Flask框架,Django原生提供了众多的功能组件,让开发更简便快速。
提供项目工程管理的自动化脚本工具( 脚手架工具 )
数据库ORM支持(对象关系映射,英语:Object Relational Mapping)
模板
表单
Admin管理站点
文件管理
认证权限
session机制
缓存
2. MVT模式
有一种程序设计模式叫MVC, 其核心思想是分工、解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。
2. Django 基础配置
2-1 环境搭建
环境准备:
2-2 pycharm创建运行项目
2-3 创建子项目
2-4 创建视图
2-5 项目配置
2-6 静态文件和路由
1. 在项目根目录下创建static_files目录来保存静态文件。
2. 在demo/settings.py中修改静态文件的两个参数为:
3. 此时在static_files添加的任何静态文件都可以使用网址 /static/文件在static_files中的路径 来访问了。
例如: 127.0.0.1:8000/static/index.html
2-7 路由
2-8 App应用配置
3. 请求
3-1 请求
3-2 请求体
3-3 请求头
4. 响应
4-1 HttpResponse
4-2 HttpResponse子类
4-3 JsonResponse
4-4 redirect重定向
5. Session
Django项目默认启用Session.
在settings.py文件中,可以设置session数据的存储方式.
另外session可以保存在数据库、本地缓存( 程序的运行内存中, 全局变量)、文件、redis等
数据库
如果是存放数据库, 一般以db结尾
SESSION_ENGINE=‘django.contrib.sessions.backends.db’
如果存储在数据库中,需要在INSTALLED_APPS中安装Session应用。
本地存储
如果是存放在本地缓存, 一般以cache结尾
SESSION_ENGINE=‘django.contrib.sessions.backends.cache’
混合存储
优先从本机内存中存取,如果没有则从数据库中存取。
SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db’
Redis
在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。
1) 安装扩展
pip install django-redis
2)配置
在settings.py文件中做如下设置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# 定义django中redis的位置
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
# django使用redis的默认客户端来进行操作.
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 我们定义一个cache(本地缓存来存储信息,cahe指定的是redis)
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 本地的session使用的本地缓存名称是'default', 这个名称就是上面我们配置的caches的名
# 称"default"
SESSION_CACHE_ALIAS = "default"
6. 类视图
- 定义类视图, 且类视图继承自View
- 使用: from django.views.generic import View
- 或者是: from django.views.generic.base import View
- 定义路由, 路由的第二个参数需要是一个函数, 所以我们会调用系统的 as_view() 方法:
urlpatterns = [
# 类视图:注册
url(r'^register/$',views.RegisterView.as_view()),
]
使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义:
# 导入类视图的父类View
from django.views.generic import View
class RegisterView(View):
"""类视图:处理注册"""
def get(self, request):
"""处理GET请求,返回注册页面"""
return render(request, 'register.html')
def post(self, request):
"""处理POST请求,实现注册逻辑"""
return HttpResponse('这里实现注册逻辑')
定义路由部分:
urlpatterns = [
# 注意:
# url(路径, 执行的函数)
# url的第二个参数需要是一个函数
# 我们这里如果传入: views.RegisterView 会发现这个是一个类, 不是一个函数,
# 所以我们需要调用系统给我们提供的 as_view() 方法
url(r'^registerview/$', views.RegisterView.as_view())
]
- 类视图的好处:
- 代码可读性好
- 类视图相对于函数视图有更高的复用性
- 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可
构造Mixin扩展类
# 第一个扩展类, 让他继承自object
class BaseView(object):
@classmethod
def as_view(cls, *args, **kwargs):
view = super().as_view(*args, **kwargs)
view = my_decorator(view)
return view
# 第二个扩展类,让他继承自object
class Base2View(object):
@classmethod
def as_view(cls, *args, **kwargs):
view = super().as_view(*args, **kwargs)
view = my_decorator2(view)
return view
# 类视图, 让他除了继承自这两个父类外, 最后继承View类.
class DemoView(BaseView, Base2View, View):
def get(self, request):
print('get方法')
return HttpResponse('ok')
def post(self, request):
print('post方法')
return HttpResponse('ok')
使用Mixin扩展类,也会为类视图的所有请求方法都添加装饰行为
说明:
因为都是继承自object,所以扩展类中的super.as_view都会去找其他的父类依次执行,最终都会执行到View这个类这里, 所以肯定会执行View中的as_view方法.
如图所示:
中间件
定义一个中间件工厂函数,然后返回一个可以调用的中间件。
中间件工厂函数需要接收一个可以调用的get_response对象。
返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象
# 中间件模板:
def simple_middleware(get_response):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。
return response
return middleware
定义好中间件后,需要在settings.py 文件中添加注册中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'users.middleware.my_middleware', # 添加中间件
]
多个中间件的执行顺序
- 在请求视图被处理前,中间件由上至下依次执行
- 在请求视图被处理后,中间件由下至上依次执行