Django框架学习(二)

简介: Django框架学习(二)

1、小知识点

1.1常用端口总结

类型 端口
SSH 22
HTTP 80
HTTPS 443
MySQL 3306
类型 端口
Redis 6379
Django 8000
Flask 5000

1.2session操作

clear()只清除键对应的值,而flush()键和值都会删除

通过HttpRequest对象的session属性进行会话的读写操作。

1)以键值对的格式写session。(重点掌握)

request.session['键']=值

2)根据键读取值。(重点掌握)

request.session.get('键',默认值)

3)清除所有session,在存储中删除值部分。

request.session.clear()

4)清除session数据,在存储中删除session的整条数据。

request.session.flush()

5)删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']


6)设置session的有效期

request.session.set_expiry(value)

1、如果value是一个整数,session将在value秒没有活动后过期。

2、如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。

3、如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。



2.类视图和中间件

2.1类视图

2.1.1函数视图

1def register(request):
2    """注册视图"""
3    if request.method == 'GET':
4        # 显示注册页面
5    else:
6        # 进行注册处理

1)函数式图的代码过多,业务逻辑不清晰。工作中,一个函数代码不要过长,不应该超过100行。

2)代码重用性比较差。类视图就可以通过继承来重用一些代码

2.1.2类视图

好处

1)代码可读性好。

2)类视图相对于函数视图有更高的复用性。想复用,直接进行继承即可。

类视图注意

1)类视图继承一个父类View

2)支持哪些请求方式,就定义哪些方法。比如支持get,定义get方法。

1from django.views.generic import View
 2
 3class RegisterView(View):
 4    """类视图:处理注册"""
 5
 6    def get(self, request):
 7        """处理GET请求,返回注册页面"""
 8        return render(request, 'register.html')
 9
10    def post(self, request):
11        """处理POST请求,实现注册逻辑"""
12        return HttpResponse('这里实现注册逻辑')

类视图使用(必须掌握)

1)先在视图中定义一个类视图,继承View;

2)然后,定义get、post等方法,如果是哪个请求方式,对应的用哪个方法处理业务。

3)创建urls,然后定义一个列表urlpatterns,

4)在列表中,配置一下视图地址。

url(r'^register/$', views.RegisterView.as_view(), name='register')

5)在总的url中进行一个包含。

类视图的原理(扩展)

原理中用到的一个小知识点

定义一个类视图后,先创建一个对象

handler = getattr(类创建出来的对象名,'对象的方法名')获取一个对象的属性

再调用这个handler()也可以调用对象的这一方法

原理

url(r'^register/$', 类视图as_view方法的返回值)中调用了类视图的as_view方法,as_view方法返回的是view方法的调用;view方法返回的是dispatch这个方法的调用;调用这个方法的时候,里面进行了一个处理(先获取了请求方法request.method,然后再利用lower()方法转成小写,比如‘GET’变成‘get’,其实就是根据不同的请求方法获取类视图中对应的请求方法);然后再调用对应的方法,将处理结果返回给view调用的地方。最后返回应答。

2.1.3装饰器

给函数视图加装饰器

给类视图加装饰器

两种方式

1、直接在url配置时手动调用装饰器函数来实现装饰器添加。

2、使用Django框架提供的method_decorator将针对函数视图装饰器添加到类视图的方法上面。

为类视图添加装饰器,可以使用上面两种方法。

为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图。

1def my_decorator(func):
 2    def wrapper(request, *args, **kwargs):
 3        print('自定义装饰器被调用了')
 4        print('请求路径%s' % request.path)
 5        return func(request, *args, **kwargs)
 6    return wrapper
 7
 8class DemoView(View):
 9    def get(self, request):
10        print('get方法')
11        return HttpResponse('ok')
12
13    def post(self, request):
14        print('post方法')
15        return HttpResponse('ok')

在URL配置中装饰

1urlpatterns = [
2    url(r'^demo/$', my_decorate(DemoView.as_view()))
3]

此种方式最简单,但因装饰行为被放置到了url配置中,单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。

此种方式会为类视图中的所有请求方法都加上装饰器行为(因为是在视图入口处,分发请求方式前)。

在类视图中装饰

在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图方法的装饰器。

method_decorator装饰器使用name参数指明被装饰的方法

1# 为全部请求方法添加装饰器
 2# name可以不写,直接写值
 3@method_decorator(my_decorator, name='dispatch')
 4class DemoView(View):
 5    def get(self, request):
 6        print('get方法')
 7        return HttpResponse('ok')
 8
 9    def post(self, request):
10        print('post方法')
11        return HttpResponse('ok')
12
13
14# 为特定请求方法添加装饰器
15# name可以不写,直接写值
16@method_decorator(my_decorator, name='get')
17class DemoView(View):
18    def get(self, request):
19        print('get方法')
20        return HttpResponse('ok')
21
22    def post(self, request):
23        print('post方法')
24        return HttpResponse('ok')

如果需要为类视图的多个方法添加装饰器,但又不是所有的方法(为所有方法添加装饰器参考上面例子),可以直接在需要添加装饰器的方法上使用method_decorator,如下所示

1from django.utils.decorators import method_decorator
 2
 3# 为特定请求方法添加装饰器
 4class DemoView(View):
 5
 6    @method_decorator(my_decorator)  # 为get方法添加了装饰器
 7    def get(self, request):
 8        print('get方法')
 9        return HttpResponse('ok')
10
11    @method_decorator(my_decorator)  # 为post方法添加了装饰器
12    def post(self, request):
13        print('post方法')
14        return HttpResponse('ok')
15
16    def put(self, request):  # 没有为put方法添加装饰器
17        print('put方法')
18        return HttpResponse('ok')

Mixin扩展类:将一些通用的功能代码封装到不同的父类中,子类中需要哪些功能,就可以直接继承对应的父类,抽取的父类就是Mixin扩展类。(目前仅作为了解,DRF框架中会用)

总结

本质:访问一个url地址可以采用不同的请求方式,当使用不同的请求方式请求同一个url地址的时候,就会调用类视图中对应的方法。

好处:代码复用性好;业务逻辑代码更加清晰。

使用:定义类视图(继承自View;支持哪些请求方式,定义哪些请求方法),进行url配置(注意一个方法.as_view()

2.2中间件

中间件相当于Flask里面的钩子函数:可以在请求之前或者请求之后做一些处理。

首先回顾一下Flask里面的钩子函数

1@before_first_requst
 2def method_funcn1(...):
 3    pass
 4
 5@before_request
 6def method_func2(...):
 7    pass
 8
 9@after_request
10def method_func3(...):
11    pass
12
13@teardown_request
14def method_func4(...):
15    pass

中间件有一个固定的模板,这个模板不需要记忆,我们用的时候直接进行复制即可,我们要知道的是我们在模板哪里添加我们需要的代码:

1def simple_middleware(get_response):
 2    # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
 3
 4    def middleware(request):
 5        # 此处编写的代码会在每个请求处理视图前被调用。
 6
 7        response = get_response(request)
 8
 9        # 此处编写的代码会在每个请求处理视图之后被调用。
10
11        return response
12
13    return middleware

2.2.1Django里面中间件使用

1、定义一个中间件

在随便一个子应用中新建一个middleware.py文件

1def my_middleware(get_response):
2    print('init 被调用')
3    def middleware(request):
4        print('before request 被调用')
5        response = get_response(request)
6        print('after response 被调用')
7        return response
8    return middleware

2、定义好中间件后,需要在settings.py 文件中添加注册中间件

1MIDDLEWARE = [
 2    'django.middleware.security.SecurityMiddleware',
 3    'django.contrib.sessions.middleware.SessionMiddleware',
 4    'django.middleware.common.CommonMiddleware',
 5    # 'django.middleware.csrf.CsrfViewMiddleware',
 6    'django.contrib.auth.middleware.AuthenticationMiddleware',
 7    'django.contrib.messages.middleware.MessageMiddleware',
 8    'django.middleware.clickjacking.XFrameOptionsMiddleware',
 9    'users.middleware.my_middleware',  # 添加中间件
10]

3、定义一个视图进行测试

1def demo_view(request):
2    print('view 视图被调用')
3    return HttpResponse('OK')

注意:在调试模式下,init部分有可能会被调用两次

2.2.2多个中间件代码执行顺序(了解)

多个中间件,init部分调用的顺序和中间件的注册顺序相反

before_request部分代码调用的顺序和中间件注册顺序相同

after_request部分代码调用的顺序和中间件注册顺序相反

2.2.3使用场景

中间件最常用的地方就是在请求前,进行CSRF校验,进行黑名单的处理。

2.2.3注意

中间件是全局的,不论你写在哪个子应用里面,工程里面所有的子应用的视图都会使用。

Django里面的中间件有所了解即可,知道怎么使用。在公司里中间件一般不会由普通员工书写。

相关文章
|
20天前
|
数据采集 中间件 Python
如何在Django框架中进行输入验证和过滤?
通过综合运用这些方法,可以在 Django 框架中有效地进行输入验证和过滤,提高应用的安全性和数据质量。同时,还可以根据具体的业务需求进一步扩展和定制验证逻辑。
102 64
|
29天前
|
开发者 数据库管理 Python
Django框架和Flask框架的区别
总体而言,Django 适合需要快速搭建大型应用的开发者,而 Flask 则更适合有特定需求和追求灵活性的开发者。
113 64
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
173 45
|
20天前
|
监控 安全 测试技术
Django框架的表单验证和过滤机制是否可以应对复杂的安全场景?
综上所述,Django 框架的表单验证和过滤机制在一定程度上可以应对复杂的安全场景,但需要综合运用多种手段来进一步提升安全性,以适应不断变化的安全挑战。
27 1
|
27天前
|
搜索推荐 API 开发者
Django框架和Flask框架的适用场景分别是什么?
总体而言,Django 更适合需要全面功能和大规模开发的场景,而 Flask 则更适合灵活性要求高、小型项目或特定需求的开发。当然,具体的选择还应根据项目的具体情况、团队的技术能力和偏好等因素来综合考虑。在实际应用中,开发者可以根据项目的特点和需求,灵活选择使用这两个框架,或者结合它们的优势来构建更强大的 Web 应用程序。
|
27天前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
29天前
|
安全 前端开发 数据库
Django框架
总的来说,Django 是一个非常优秀的 Web 框架,它为开发者提供了坚实的基础和丰富的功能,使得构建高质量的 Web 应用变得更加容易和高效。无论是初学者还是经验丰富的开发者,都可以从中受益,利用它来实现自己的创意和想法。
40 4
|
1月前
|
Python
Django 框架的路由系统
Django 框架的路由系统
44 6
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
59 2
|
2月前
|
SQL Java 数据库
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
这篇文章是关于如何使用Django框架的ORM系统在视图(views)层面进行数据库的增、删、改、查操作的教程。
24 0
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
下一篇
DataWorks