Django知识点总结

    因为最近在搞一个Python项目,使用的Django框架。所以快速学习了一下这个web框架。并做一些总结。

       Django官网的介绍:Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers, it takes care of much of the hassle of web development, so you can focus on writing your app without needing to reinvent the wheel. It’s free and open source.

Django是一个高级Python web框架,它鼓励快速开发和清晰、实用的设计。由经验丰富的开发者构建,它处理了许多web开发的繁琐工作,这样你就可以专注于编写你的应用程序,而不需要重新发明轮子。

目录

1.Django项目结构

2.Django 模型 (Models)

3.Django 视图 (Views)

4.Django 模板 (Templates)

5.Django 表单 (Forms)

6. Django URL 配置 (URL Configuration)

7.Django 表单验证 (Form Validation)

8.Django 管理界面 (Admin Interface)

9.Django 中间件 (Middleware)

10.Django 信号 (Signals)

11.Django 表单渲染与提交处理

12.Django 静态文件和媒体管理

13.Django 会话 (Sessions)

14.Django 认证系统 (Authentication System)

15.Django 表单字段 (Form Fields)

16.Django 模板标签和过滤器 (Template Tags and Filters)

17.Django 模型查询 (Model Queries)

18.Django 表单的自定义验证和错误消息

19.Django 测试框架 (Testing Framework)

20.Django 国际化和本地化 (Internationalization and Localization)

21.Django安全性

22. Django REST framework 

23.Django 任务队列

 24.Django 邮件支持


(由于内容太多,所以分成两篇,还有一篇,从25开始)

1.Django项目结构
描述
项目Django 项目的顶级目录。
应用一个应用是Web应用程序,它执行某项功能,并且可以独立于其他应用运行。
模型用于定义数据结构(数据库中的表)。
视图应用逻辑的核心,用于处理HTTP请求并返回HTTP响应。
模板HTML文件,可以包含变量,用于生成动态的网页内容。
表单用于创建HTML表单,处理用户输入。
URL分发器Django URL分发器是URL和视图之间的映射。
设置Django项目的配置文件。
管理界面一个自动生成的管理界面,用于管理Django项目中的数据。
信号Django信号允许某些发送者通知一组接收者发生了某件事情。
表单媒体表单可能会用到的媒体文件,如CSS或JavaScript文件。

示例:

假设我们有一个博客应用,其结构可能如下:

myblog/
    myblog/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    blog/
        __init__.py
        models.py
        tests.py
        views.py
        admin.py
        apps.py
        migrations/
        templates/
        urls.py
    manage.py
    db.sqlite3

在这个示例中,myblog 是项目的根目录,它包含了一个同名的子目录,这是Django项目的常见布局。blog 是一个应用,它包含了所有的模型、视图、表单和模板等文件。settings.py 包含了项目的配置,urls.py 包含了URL分发器的定义。

2.Django 模型 (Models)

Django的模型用于定义应用程序的数据结构,它们是与数据库表相对应的Python类。

概念描述
Field代表数据库中的列,用于定义字段类型和选项。
Model一个继承自django.db.models.Model的类,代表数据库中的一个表。
Meta可选的类,用于定义模型的元数据,如排序选项、数据库表名等。
Manager用于创建查询集的接口,可以自定义以提供额外的查询方法。
QuerySet模型对象的集合,可以执行数据库查询。
Form与模型相关联的表单,用于创建和管理用户输入。
AdminDjango管理界面中用于管理模型的接口。
Migrations数据库迁移,用于在数据库中创建、修改或删除模型的表。

示例: 

假设我们有一个博客应用,需要定义一个文章模型:

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    published_date = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['-published_date']

 这个示例中,Article 是一个模型,它定义了博客文章的数据结构。titlecontentpublished_datelast_modified 是字段,分别对应数据库表中的列。author 是一个外键字段,它指向auth.User模型,表示文章的作者。Meta 类用于指定默认的排序方式。

3.Django 视图 (Views)

视图是Django应用的核心,用于处理HTTP请求并返回HTTP响应。视图可以是简单的Python函数,也可以是基于类的视图。

概念描述
Function-based View (FBV)基于函数的视图,使用Python函数处理请求。
Class-based View (CBV)基于类的视图,使用Python类处理请求,提供可重用的视图组件。
HTTP Methods视图可以处理的HTTP请求方法,如GET、POST、PUT、DELETE等。
Request Object包含HTTP请求信息的对象,如请求头、请求体等。
Response Object用于构造HTTP响应的对象,可以包含状态码、内容、头部等。
URLconfURL配置,用于将URL路径映射到视图函数。
Template Rendering使用模板生成HTML内容的过程。
Context传递给模板的上下文数据,用于动态生成网页内容。
Form Handling表单处理,包括显示表单和处理表单提交。
Generic View预构建的基于类的视图,适用于常见的Web应用场景。

示例:

以下是一个简单的基于函数的视图,用于返回一个欢迎信息:

from django.http import HttpResponse

def welcome(request):
    name = request.GET.get('name', 'World')
    return HttpResponse(f"Hello, {name}!")

 这个示例中,welcome 函数是一个视图,它从GET请求中获取name参数,并返回一个包含问候语的HttpResponse对象。

4.Django 模板 (Templates)

Django模板是一个强大的工具,用于生成动态的HTML内容。模板可以包含变量、标签和过滤器,用于控制页面的内容和显示。

概念描述
变量用于在模板中插入上下文数据。
标签用于执行特定的操作,如循环、条件判断等。
过滤器对变量进行处理,如格式化日期、转换为大写等。
继承允许模板继承其他模板,共享布局和重复利用代码。
用于在继承的模板中定义可替换的区域。
自定义标签创建自定义的模板标签,以封装复杂的逻辑。
模板继承允许模板之间相互继承,实现布局的一致性。
上下文传递给模板的数据,用于动态生成内容。
模板渲染Django视图调用模板的过程,将上下文数据插入模板。

示例:以下是一个简单的Django模板示例,它显示一个列表和用户的姓名

<!DOCTYPE html>
<html>
<head>
    <title>My Webpage</title>
</head>
<body>
    <h1>Welcome, {{ user.name }}!</h1>
    <ul>
        {% for item in items %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
</body>
</html>

 这个示例中,{{ user.name }} 是一个变量,它将从上下文中获取user对象的name属性。{% for item in items %} 是一个标签,它将遍历上下文中的items列表,并为每个元素生成一个列表项。

5.Django 表单 (Forms)

Django提供了一个强大的表单处理框架,用于创建、验证和处理HTML表单。

概念描述
Form ClassDjango表单类,用于定义表单的结构和验证规则。
Field表单中的一个字段,对应HTML表单中的一个输入控件。
Widget用于渲染字段的HTML控件,如文本框、复选框等。
Form Validation表单提交后,Django将自动进行数据验证。
Bound Field表单渲染后,每个字段都对应一个Bound Field对象。
Errors表单验证失败时的错误信息。
Formsets用于处理多个相同表单的集合。
ModelForm一个特殊类型的表单,它与Django模型自动关联。
Media表单可能需要的CSS和JavaScript文件。
Custom Validation自定义验证方法,用于执行额外的验证逻辑。

示例: 以下是一个使用Django表单创建用户注册表单的示例

from django import forms
from django.contrib.auth.models import User

class UserRegistrationForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)
    confirm_password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['username', 'email']

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get("password")
        confirm_password = cleaned_data.get("confirm_password")

        if password and confirm_password and password != confirm_password:
            self.add_error('confirm_password', "Passwords do not match.")

 这个示例中,UserRegistrationForm 是一个继承自ModelForm的表单类,它关联到Django内置的User模型。除了usernameemail字段外,表单还包括了passwordconfirm_password字段,用于验证密码是否匹配。

6. Django URL 配置 (URL Configuration)

URL配置是Django应用中用于将URL路径映射到视图函数的机制。

概念描述
URL Pattern用于匹配URL的模式,可以是字符串或正则表达式。
URL Resolver解析器,用于将URL映射到视图。
URL NameURL的名称,用于在模板和代码中引用特定的URL。
URLconfURL配置文件,包含URL模式的列表。
Path用于定义简单URL模式的函数。
Re_path用于定义基于正则表达式的URL模式的函数。
Include用于将其他URLconf包含到当前URLconf中。
Namespace用于组织URL,允许多个应用使用相同的URL名称。
Reverse Resolution从视图名称和参数解析出URL的过程。
URL Parameters传递给视图的参数,可以是路径参数或查询参数。

 示例:以下是Django项目的URL配置示例

from django.urls import path, include
from myapp.views import home_view, about_view, ArticleListView

urlpatterns = [
    path('', home_view, name='home'),
    path('about/', about_view, name='about'),
    path('articles/', include(('blog.urls', 'blog'), namespace='blog')),
]

 这个示例中,path 函数用于定义URL模式,第一个参数是URL路径,第二个参数是视图函数,name 参数为URL提供一个唯一的标识符。include 函数用于将博客应用的URL配置包含到主URL配置中,并指定了一个命名空间blog

7.Django 表单验证 (Form Validation)

Django表单提供了一套完整的验证机制,确保用户输入的数据符合预期的格式和规则。

概念描述
内置验证Django表单字段拥有一套默认的验证规则。
自定义验证通过覆盖clean_<field_name>方法或使用clean方法来添加自定义验证逻辑。
错误消息为验证错误提供自定义的错误消息。
必填字段使用blank=Falsenull=False来标记必填字段。
字段类型Django提供多种字段类型,如CharFieldIntegerField等,每种类型都有其特定的验证规则。
最大长度/最小长度使用max_lengthmin_length参数来限制输入的长度。
选择字段使用choices参数来限制字段只能从预定义的选项中选择。
正则表达式验证使用正则表达式来定义复杂的验证规则。
跨站请求伪造保护Django表单自动提供了CSRF保护。
自定义错误信息为每个字段的验证错误提供自定义的错误信息。

示例: 以下是自定义表单验证的示例

from django import forms
from django.core.exceptions import ValidationError

class SignupForm(forms.Form):
    username = forms.CharField()
    email = forms.EmailField()

    def clean_username(self):
        username = self.cleaned_data.get('username')
        if len(username) < 4:
            raise ValidationError('Username must be at least 4 characters long.')
        return username

    def clean(self):
        cleaned_data = super().clean()
        username = cleaned_data.get('username')
        email = cleaned_data.get('email')
        if username and User.objects.filter(username=username).exists():
            raise ValidationError('Username is already taken.')
        if email and User.objects.filter(email=email).exists():
            raise ValidationError('Email is already registered.')
        return cleaned_data

 这个示例中,SignupForm 表单通过覆盖clean_username方法来确保用户名至少有4个字符。clean方法则用于检查用户名和邮箱是否已经存在。

8.Django 管理界面 (Admin Interface)

Django的管理界面是一个自动生成的基于Web的界面,用于管理Django项目中的数据。

概念描述
Django AdminDjango提供的管理界面,用于管理数据库中的内容。
ModelAdmin用于自定义模型在管理界面中的表示方式的类。
AdminSite管理站点的顶级对象,可以创建自定义的管理界面。
Inlines在管理界面中,将相关对象以内联形式编辑的方式。
Filters在管理界面中添加筛选器,方便用户筛选查找数据。
Actions为管理界面的变更列表页面提供批量操作。
Custom Templates使用自定义模板来修改管理界面的外观。
User Authentication管理界面具有用户认证和权限控制。
Modules管理界面中的模块,通常对应一个模型或一组相关对象。
Views管理界面提供的各种视图,如列表视图、添加视图、更改视图等。

示例:以下是如何为Article模型自定义管理界面的示例

from django.contrib import admin
from .models import Article

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'published_date')
    list_filter = ('author', 'published_date')
    search_fields = ('title', 'content')

admin.site.register(Article, ArticleAdmin)

 这个示例中,ArticleAdmin类定义了Article模型在管理界面中的显示方式。list_display属性定义了列表视图中显示哪些字段,list_filter添加了筛选器,而search_fields允许在管理界面中搜索文章。

9.Django 中间件 (Middleware)

Django中间件提供了一种机制,可以在请求和响应的处理过程中添加自定义的处理逻辑。

概念描述
请求中间件在Django处理请求之前运行的中间件。
响应中间件在Django处理完请求并生成响应之后,发送到浏览器之前运行的中间件。
Middleware Classes中间件类,需要实现特定的方法来定义中间件的行为。
Middleware Stack中间件的执行顺序,可以通过设置文件进行配置。
自定义中间件创建自定义的中间件类以添加特定的功能。
Middleware SignalsDjango的信号机制,可以在中间件中使用。
Middleware Security中间件可以用于提高应用的安全性,如CSRF保护。
Middleware Session用于处理会话的中间件。
Middleware Process View用于在视图处理请求之前或之后运行的中间件。
Middleware Exception用于处理异常的中间件。

示例:以下是创建自定义中间件的示例

class MyCustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 这里可以添加处理逻辑
        response = self.get_response(request)
        return response

    # 可选:处理请求之前
    def process_view(self, request, view_func, view_args, view_kwargs):
        return None  # 或者返回一个HttpResponse对象

    # 可选:处理请求之后
    def process_response(self, request, response):
        return response

 这个示例中,MyCustomMiddleware 是一个简单的中间件类,它在请求处理管道中可以插入自定义逻辑。__call__ 方法会在请求处理之前运行,而process_viewprocess_response方法则分别在视图处理之前和之后运行。

10.Django 信号 (Signals)

Django的信号允许某些发送者通知一组接收者发生了某件事情。这是一种实现解耦的方法,可以在Django的生命周期事件中添加自定义逻辑。

概念描述
信号Django中的一种机制,允许在特定事件发生时执行自定义代码。
发送者触发信号的对象。
接收者信号的回调函数,定义了当信号发生时要执行的代码。
连接信号将接收者函数连接到特定信号上的过程。
内置信号Django提供的一系列内置信号,如post_savepre_delete等。
自定义信号创建自定义信号以在特定业务逻辑中使用。
信号调度器Django内部用于调度信号的组件。
信号参数信号可以传递给接收者的参数,通常是触发信号的对象。
信号禁用在某些情况下临时禁用信号。

示例:以下是如何使用Django信号的示例

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Article

@receiver(post_save, sender=Article)
def update_search_index(sender, instance, **kwargs):
    # 当Article对象被保存后,更新搜索索引
    pass

 这个示例中,我们连接了一个名为update_search_index的接收者函数到Article模型的post_save信号上。这意味着每当有一个新的Article对象被保存时,update_search_index函数就会被调用

11.Django 表单渲染与提交处理

Django表单不仅用于收集用户输入,还包括渲染成HTML以及处理表单提交的逻辑。

概念描述
表单渲染将表单对象转换成HTML的过程,用于在客户端显示。
表单提交用户填写表单并发送到服务器的过程。
表单绑定将提交的数据绑定到表单对象上,以便于进行验证。
表单无效如果表单验证失败,表单对象会标记为无效,并收集错误信息。
表单有效如果表单验证通过,表单对象会标记为有效。
错误收集收集表单中所有字段的验证错误。
表单重渲染当表单无效时,需要将表单连同错误信息重新渲染给用户。
GET请求与表单使用GET请求预填充表单数据。
POST请求与表单使用POST请求提交表单数据。

示例: 以下是如何在Django视图中渲染和处理表单的示例

from django.http import HttpResponse
from django.shortcuts import render
from .forms import ContactForm

def handle_contact_form(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 处理有效的表单数据
            form.save()
            return HttpResponse("Thanks for your message!")
    else:
        form = ContactForm()

    return render(request, 'contact.html', {'form': form})

这个示例中,当用户通过POST方法提交表单时,我们创建了一个绑定到请求POST数据的表单对象。如果表单有效,我们处理表单数据并返回一个响应。如果表单无效,我们重新渲染表单,并将表单对象及其错误信息传递给模板。

12.Django 静态文件和媒体管理

在Web开发中,静态文件(如CSS、JavaScript文件)和媒体文件(如图片、视频)是构成用户界面和提供附加内容的重要组成部分。Django提供了管理这些文件的机制。

概念描述
静态文件指在Web开发中通常不会频繁改变的文件,如CSS、JavaScript文件。
媒体文件指用户上传的文件,如图片、文档等。
STATIC_URL设置静态文件的URL前缀。
STATICFILES_DIRS在开发过程中,指定额外的目录,Django将这些目录中的文件视为静态文件。
STATIC_ROOT在生产环境中,指定一个根目录,Django会将所有的静态文件收集到这里。
媒体URL和MEDIA_ROOT类似于静态文件的设置,但用于媒体文件。
收集静态使用collectstatic命令将所有静态文件收集到STATIC_ROOT指定的目录下。
管理媒体文件Django提供了一个管理界面来上传和管理媒体文件。
自定义存储使用自定义的存储后端来处理静态和媒体文件的存储逻辑。

示例: 以下是如何在Django中设置静态文件和媒体文件的示例

# settings.py

# 指定静态文件的URL前缀和根目录
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    BASE_DIR / "static",  # 开发过程中的静态文件目录
]

# 指定媒体文件的URL前缀和根目录
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / "media"  # 媒体文件的文件系统路径

 这个示例中,我们设置了静态文件和媒体文件的URL前缀以及它们在开发过程中的目录。在生产环境中,通常会使用像Amazon S3或CDN这样的服务来托管这些文件。

推荐直接放在项目根目录下的static目录,当然也可以改变目录,比如自定义个其他目录(根目录下的common目录下的static目录)

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, "static")
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "common/static"),
]
13.Django 会话 (Sessions)

Django的会话框架提供了一种存储用户会话数据的方法,这些数据可以用来跟踪用户的状态。

概念描述
会话存储在服务器端的数据,用于跟踪用户的状态。
会话ID用于标识用户会话的唯一标识符,通常存储在cookie中。
会话数据用户会话的相关信息,如用户偏好、购物车内容等。
会话引擎Django支持的会话后端,如数据库、缓存或文件。
设置会话在视图或中间件中设置会话数据。
获取会话从会话中读取数据。
删除会话清除会话中的数据或结束整个会话。
会话超时会话的有效期,超时后需要重新登录。
安全会话使用HTTPS和安全的cookie标志来保护会话数据。

示例:以下是如何在Django中使用会话的示例

def set_session(request):
    request.session['mydata'] = 'This is a test.'

def get_session(request):
    mydata = request.session.get('mydata', 'Default value')
    return HttpResponse(mydata)

def clear_session(request):
    del request.session['mydata']
    return HttpResponse('Session data cleared')

 这个示例中,我们展示了如何在视图中设置、获取和删除会话数据。会话数据存储在request.session字典中。

14.Django 认证系统 (Authentication System)

Django提供了一个强大的认证系统,用于管理用户认证、权限和用户组。

概念描述
用户模型Django默认使用auth.User模型,也可以自定义用户模型。
认证验证用户身份的过程。
权限控制用户对视图、模板或其他资源的访问。
用户组允许将权限分配给一组用户。
信号Django认证系统发出的信号,如user_logged_in
密码管理Django提供密码散列、密码验证和密码重置功能。
令牌认证用于API的无状态认证机制。
会话认证传统的基于cookie的认证机制。
自定义认证创建自定义的认证后端。
多因素认证可以集成多因素认证以增加安全性。

 示例:以下是如何在Django中实现用户登录和注销的示例

from django.contrib.auth import authenticate, login, logout

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return HttpResponse("You are logged in.")
        else:
            return HttpResponse("Invalid username or password.")
    else:
        return render(request, 'login.html')

def logout_view(request):
    logout(request)
    return HttpResponse("You are logged out.")

这个示例中,login_view函数处理用户登录,通过authenticate函数验证用户凭据,如果成功则使用login函数创建用户会话。logout_view函数使用logout函数结束用户会话。

15.Django 表单字段 (Form Fields)

Django表单框架提供了多种字段类型,用于处理不同类型的用户输入。

概念描述
CharField文本框,用于输入较短的文本。
EmailField邮箱输入框,自动验证输入是否为有效的邮箱地址。
IntegerField数字输入框,用于输入整数值。
DecimalField十进制数输入框,用于处理小数值。
DateField日期选择器,用于选择日期。
DateTimeField日期和时间选择器,用于选择日期和时间。
ChoiceField下拉菜单,从预定义的选项中选择一个值。
MultipleChoiceField多选下拉菜单,允许选择多个值。
BooleanField复选框,表示布尔值(True/False)。
FileField文件上传控件,用于上传文件。
ImageField图片上传控件,继承自FileField,用于上传图片文件。
TypedChoiceField带类型检查的选项字段,确保选择的值是预期的类型。
SlugField用于输入简洁的标识符,如URL的一部分。
URLField输入框,用于输入URL地址,自动进行URL格式验证。

示例: 以下是如何在Django表单中使用不同字段类型的示例

from django import forms

class UserRegistrationForm(forms.Form):
    username = forms.CharField(label='Username', max_length=50)
    email = forms.EmailField(label='Email')
    age = forms.IntegerField(label='Age', min_value=18)
    birthdate = forms.DateField(label='Birth Date')
    password = forms.CharField(label='Password', widget=forms.PasswordInput)
    agree_terms = forms.BooleanField(label='Agree to Terms', required=True)
    favorite_color = forms.ChoiceField(label='Favorite Color', choices=[
        ('red', 'Red'),
        ('blue', 'Blue'),
        ('green', 'Green'),
    ])

 这个示例中,我们定义了一个注册表单,包含了不同类型的字段,每个字段都通过forms.Field的相应类来创建。

16.Django 模板标签和过滤器 (Template Tags and Filters)

Django模板系统提供了许多内置的标签和过滤器,用于在模板中执行常见的操作。

概念描述
标签用于执行特定的操作,如循环、条件判断等。
过滤器用于对模板变量进行处理,如格式化、转换等。
自定义标签创建自定义的模板标签,以封装复杂的逻辑。
自定义过滤器创建自定义的过滤器,以执行特定的数据转换。
注释标签在模板中添加注释,这些注释不会在渲染后的页面上显示。
URL标签用于生成视图的URL,支持命名的URL模式。
循环标签for,用于在模板中遍历列表或字典。
条件标签ifelse,用于在模板中实现条件逻辑。
转义过滤器对输出进行HTML转义,防止跨站脚本攻击。
日期过滤器对日期进行格式化。
字符串操作过滤器truncateupperlower等,用于操作字符串。

示例: 以下是如何在Django模板中使用标签和过滤器的示例

<!-- 使用for标签遍历一个列表 -->
<ul>
  {% for item in items %}
    <li>{{ item.name }}</li>
  {% endfor %}
</ul>

<!-- 使用if标签进行条件判断 -->
<p>{% if user.is_authenticated %}Welcome, {{ user.username }}!{% endif %}</p>

<!-- 使用url标签生成视图的URL -->
<a href="{% url 'home' %}">Home</a>

<!-- 使用过滤器格式化输出 -->
<p>Published on: {{ article.pub_date|date:"F j, Y" }}</p>

<!-- 使用自定义过滤器 -->
<p>Custom filter: {{ some_value|my_custom_filter }}</p>

 这个示例中,for标签用于遍历一个名为items的上下文变量,if标签用于判断用户是否已认证,url标签用于生成视图的URL,而date过滤器用于格式化日期。

17.Django 模型查询 (Model Queries)

Django的ORM(Object-Relational Mapping)系统提供了一套强大的查询API,用于从数据库中检索和操作数据。

概念描述
查询集 (QuerySet)模型对象的集合,可以执行数据库查询。
筛选 (Filter)用于筛选特定记录的查询。
排除 (Exclude)用于排除特定记录的查询。
排序 (Ordering)用于对查询结果进行排序。
聚合 (Aggregate)用于执行字段的聚合操作,如求和、平均值等。
F对象用于引用模型中的字段,常用于更新操作。
Q对象用于实现复杂的查询。
迭代 (Iterate)遍历QuerySet以获取模型实例。
计数 (Count)计算QuerySet中的记录数。
切片 (Slice)获取QuerySet中的子集。
更新 (Update)更新数据库中的记录。
删除 (Delete)从数据库中删除记录。

示例: 以下是如何使用Django模型查询的示例

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    published_date = models.DateTimeField()

# 获取所有已发布的文章
published_articles = Article.objects.filter(published_date__lte=timezone.now())

# 获取标题包含"Django"的文章,排除标题为"Hello"的文章
filtered_articles = Article.objects.filter(title__icontains='django').exclude(title='Hello')

# 统计文章数量
article_count = Article.objects.count()

# 更新所有文章的标题
Article.objects.all().update(title='New Title')

# 删除标题为空的文章
Article.objects.filter(title='').delete()

 这个示例中展示了如何使用Django的查询API来执行不同的数据库操作。

18.Django 表单的自定义验证和错误消息

Django表单框架允许开发者自定义表单字段的验证逻辑,并为验证失败的情况提供详细的错误消息。

概念描述
自定义验证方法在表单或表单字段类中定义额外的验证逻辑。
错误消息为不同的验证错误指定自定义的错误消息。
错误信息对象使用ErrorDictErrorList来处理表单和字段的错误信息。
跨字段验证使用cleaned_data来在多个字段之间进行验证。
表单方法覆盖表单类的方法,如cleanvalidate等,来添加验证逻辑。

示例:以下是如何在Django表单中实现自定义验证和错误消息的示 

from django import forms
from django.core.exceptions import ValidationError

class CustomUserForm(forms.ModelForm):
    username = forms.CharField()
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email']

    def clean_username(self):
        username = self.cleaned_data.get('username')
        if len(username) < 4:
            raise ValidationError('Username must be at least 4 characters long.')
        return username

    def clean(self):
        cleaned_data = super().clean()
        username = cleaned_data.get('username')
        email = cleaned_data.get('email')

        if not username.endswith('@example.com'):
            self.add_error('username', 'Username must end with @example.com')

        if User.objects.filter(email=email).exists():
            self.add_error('email', 'An account with this email already exists.')
        return cleaned_data

这个示例中,我们定义了一个CustomUserForm表单,它在clean_username方法中验证用户名长度,并在clean方法中进行跨字段验证,确保用户名以@example.com结尾,同时检查邮箱是否已存在。

19.Django 测试框架 (Testing Framework)

Django提供了一个强大的测试框架,用于编写和运行自动化测试,以确保应用的正确性和稳定性。

概念描述
单元测试对应用中最小的可测试部分进行测试,通常是模型或视图。
功能测试对整个应用或特定功能进行测试,模拟用户与应用的交互。
测试客户端Django提供的一个工具,用于模拟浏览器的行为。
测试数据库Django测试框架支持多种数据库,可以在测试中使用特定的数据库。
断言用于验证测试结果是否符合预期。
测试标记用于标记测试用例,如@pytest.mark.django_db
测试夹具测试中使用的预设数据和环境配置。
测试覆盖率衡量测试覆盖了多少代码的指标。
测试套件一组测试用例的集合。
测试运行器用于运行测试用例的工具。

示例: 以下是如何在Django中编写单元测试的示例

from django.test import TestCase
from .models import Article

class ArticleModelTest(TestCase):
    def setUp(self):
        # 创建测试夹具数据
        Article.objects.create(title='Test Article', content='This is a test.')

    def test_string_representation(self):
        # 测试模型的字符串表示
        article = Article.objects.get(id=1)
        self.assertEqual(str(article), 'Test Article')

    def test_article_content(self):
        # 测试文章内容
        article = Article.objects.get(id=1)
        self.assertEqual(article.content, 'This is a test.')

    def test_articles_created(self):
        # 测试创建的文章数量
        self.assertEqual(Article.objects.count(), 1)

 这个示例中,ArticleModelTest类包含了针对Article模型的多个测试方法。setUp方法会在每个测试方法前运行,用于设置测试夹具。

20.Django 国际化和本地化 (Internationalization and Localization)

Django支持国际化和本地化,使得应用可以轻松地适应不同的语言和地区。

概念描述
国际化 (Internationalization)准备一个应用或文档,使其能够无障碍地适应不同的语言和地区,而不做代码级别的改变。
本地化 (Localization)将国际化的应用或文档,根据特定语言和地区的需要进行调整。
gettextDjango使用的库,用于提取翻译字符串和实现翻译功能。
语言设置Django支持动态地根据请求设置用户界面的语言。
翻译字符串需要翻译的文本字符串。
.po 文件包含翻译的文件,由gettext工具使用。
时区支持Django支持不同地区的时区设置。
格式化对日期、时间、数字等进行本地化格式化。
双语支持应用支持多种语言的输入和显示。

示例: 以下是如何在Django中实现国际化和本地化的示例

  1. settings.py中启用国际化,并设置默认语言:
USE_I18N = True
LANGUAGE_CODE = 'en-us'
USE_L10N = True  # 启用地区格式化,如日期和数字
TIME_ZONE = 'UTC'

          2.使用makemessages命令从代码中提取翻译字符串:

python manage.py makemessages -l es

          3. 创建或编辑.po文件,添加翻译:

msgid "Welcome to our site."
msgstr "Bienvenido a nuestro sitio."

          4.在模板中使用翻译:

<p>{% trans "Welcome to our site." %}</p>

          5. 在视图中动态设置语言:

def set_language(request):
    lang_code = request.GET.get('lang')
    if lang_code:
        request.session[LANGUAGE_SESSION_KEY] = lang_code
    return redirect('home')

这个示例中,我们展示了如何在Django中设置国际化支持,提取翻译字符串,以及如何在模板和视图中使用翻译。

21.Django安全性

Django设计时就考虑了安全性,提供了多种机制来保护Web应用。以下是Django安全性的关键点总结:

安全性特性描述示例
CSRF保护Django自动为每个表单生成CSRF令牌,防止跨站请求伪造攻击。在模板中使用 {% csrf_token %} 插入CSRF令牌。
XSS保护Django模板自动转义HTML,防止跨站脚本攻击。不需要特别操作,模板系统默认转义变量内容。
密码哈希用户密码使用强哈希算法进行存储,而不是明文。使用make_password函数创建哈希密码,check_password进行验证。
SQL注入保护Django ORM自动转义查询参数,防止SQL注入攻击。使用ORM查询构造器,如Article.objects.filter(pk=1)
HTTPS强制可以设置Django来强制使用HTTPS。settings.py中设置SECURE_SSL_REDIRECT = True
用户认证提供用户认证和权限控制。使用@login_required装饰器限制视图的访问。
内容安全策略可以通过设置来增强Web应用的CSP。settings.py中设置CSP_DEFAULT_SRC = ("'self'",)
安全的Cookie可以设置Cookie为仅通过HTTPS发送。settings.py中设置SESSION_COOKIE_SECURE = True
点击劫持保护Django提供中间件防止点击劫持攻击。settings.py中设置X_FRAME_OPTIONS = 'DENY'
安全的密码重置提供安全的密码重置流程,通过邮箱验证。使用PasswordResetViewPasswordResetConfirmView
用户权限可以为用户分配不同的权限。使用User.has_perm('app.label')检查权限。
用户组用户可以归属于不同的组,方便权限管理。使用GroupGroup.objects.add()管理用户组。

以下是一些Django安全性特性的具体示例:

  1. CSRF保护示例:在HTML模板中,使用Django模板标签来添加CSRF令牌。
<form method="post">
    {% csrf_token %}
    <input type="text" name="username">
    <input type="submit" value="Submit">
</form>

      2.密码哈希示例: 使用Django内置的函数来创建和验证哈希密码。

from django.contrib.auth.hashers import make_password, check_password

hashed_password = make_password('mypassword')
# 存储hashed_password到数据库

# 在验证时
password = 'mypassword'
if check_password(password, hashed_password):
    print("Password is correct")
else:
    print("Password is incorrect")

      3.HTTPS强制示例:

          配置https的步骤:

          3.1首先,你需要一个SSL证书。有两种主要类型的SSL证书:

               付费证书:从证书颁发机构(CA)购买。

               免费证书:可以使用Let's Encrypt,这是一个非营利组织,提供自动化的免费证书。

          3.2配置Web服务器以使用SSL

                对于Nginx,需要在server块中添加SSL配置。

server {
    listen 443 ssl;
    server_name www.yourdomain.com;

    ssl_certificate /path/to/your/cert.pem;
    ssl_certificate_key /path/to/your/key.pem;

    location / {
        proxy_pass http://unix:/path/to/your/project.sock;
        # 其他配置...
    }
}

        3.3. 在项目中启用HTTPS

             在settings.py中启用Django的HTTPS安全措施:

# 强制使用HTTPS重定向
SECURE_SSL_REDIRECT = True

# 如果用户已经通过HTTPS访问,则保持会话为HTTPS
SESSION_COOKIE_SECURE = True

# CSRF保护cookie也通过HTTPS发送
CSRF_COOKIE_SECURE = True

# 设置X-XSS-Protection标头
SECURE_BROWSER_XSS_FILTER = True

# 设置X-Content-Type-Options响应头为nosniff
SECURE_CONTENT_TYPE_NOSNIFF = True

# 如果使用Let's Encrypt,可以禁用此设置
SECURE_HSTS_SECONDS = 31536000  # 1 year
SECURE_HSTS_INCLUDE_SUBDOMAINS = True

      4. 用户权限示例:限制视图只有拥有特定权限的用户才能访问。

from django.contrib.auth.decorators import permission_required

@permission_required('app.change_article', raise_exception=True)
def edit_article_view(request, article_id):
    # 视图逻辑

通过这些安全特性和示例,Django提供了一个安全的框架,帮助开发者构建安全的Web应用

22. Django REST framework 

Django REST framework (DRF) 是一个强大的工具,用于构建Web API,以下是其关键特性的总结:

特性描述示例
序列化器 (Serializers)用于将模型转换为JSON或其他内容类型,以及将输入数据反序列化为模型实例。

serializers.py文件

class UserSerializer(serializers.ModelSerializer):  
     class Meta:
         model = User
         fields = '__all__'

视图 (Views)提供多种视图类来处理API请求,如列表视图、详情视图等。

views.py文件

from rest_framework import views

class UserListView(views.APIView):

视图集 (Viewsets)用于简化API视图的创建,特别适合CRUD操作。

views.py文件

from rest_framework import viewsets

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

路由 (Routing)基于函数的路由系统,用于定义API的URL结构。

urls.py文件

urlpatterns = [ path('users/', UserViewSet.as_view({'get': 'list', 'post': 'create'})),]

权限 (Permissions)控制对API的访问,可以定义自定义权限类。

permissions.py文件

class IsAdminOrReadOnly(BasePermission):
      def has_permission(self, request, view):
            return request.method in ['GET', 'HEAD', 'OPTIONS'] or request.user.is_admin

分页 (Pagination)支持对API响应进行分页。在视图或视图集中设置分页:pagination_class = PageNumberPagination
版本控制 (Versioning)支持API版本的管理。

urls.py文件

from rest_framework.versioning import NamespaceVersioning

urlpatterns = NamespaceVersioning.urlpatterns(pattern)

认证 (Authentication)提供多种认证方式,如基本认证、令牌认证等。在视图中设置认证方式:authentication_classes = [SessionAuthentication, TokenAuthentication]
过滤 (Filtering)支持对查询集进行过滤。

views.py:文件

from rest_framework import generics

class UserList(generics.ListAPIView):
      queryset = User.objects.all()
      filter_backends = [filters.SearchFilter]
      search_fields = ['username', 'email']

**关系 (Relations))支持对模型关系的序列化。在序列化器中定义关系:user = serializers.PrimaryKeyRelatedField(many=True)
验证 (Validation)提供强大的数据验证机制。在序列化器中使用validate_<field>方法进行自定义验证。
自定义 (Customization)可以自定义序列化器、视图等组件。创建自定义的序列化器类和视图类来满足特定的业务需求。

示例:以下是使用Django REST framework创建一个简单的用户API的示例

1.安装Django REST framework

pip install djangorestframework==3.13.1

2.配置Django settings(settings.py)

INSTALLED_APPS = [
    # ...
    'rest_framework',
]

3.创建一个简单的用户序列化器(serializers.py)

from rest_framework import serializers
from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email')

4.创建一个视图以列出所有用户(views.py)

from rest_framework import generics
from django.contrib.auth.models import User
from .serializers import UserSerializer

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

5.设置URL路由(urls.py)

from django.urls import path
from .views import UserList

urlpatterns = [
    path('users/', UserList.as_view()),
]

6,运行应用

启动Django开发服务器,并在浏览器或Postman中访问 http://localhost:8000/users/ 以查看用户列表。

通过以上步骤,你可以快速构建一个简单的用户API,这只是Django REST framework强大功能的一小部分。

23.Django 任务队列
知识点描述Django-Q 示例Celery 示例
安装安装任务队列库的必要步骤。pip install django-qpip install celery
配置settings.py中添加队列相关的配置。添加到INSTALLED_APPS,配置数据库迁移。设置Celery相关的配置,如broker_url
任务定义创建执行后台任务的函数。使用标准的Python函数。使用带有@task装饰器的函数。
任务调度安排任务在特定时间执行。使用schedule函数。使用Celery Beat和定时任务调度。
异步任务将任务提交到队列进行异步执行。使用async_task函数。使用delay方法。
任务执行任务队列的工作进程执行任务。使用qcluster命令启动工作进程。使用celeryd命令启动工作进程。
结果存储存储任务执行结果。利用Django模型存储结果。可以配置多种后端存储结果,如数据库、Redis。
任务重试失败的任务可以被重试。提供重试机制和超时设置。提供重试策略和重试计数。
任务监控和管理管理和监控任务队列的状态。通过Django管理界面管理任务。通常使用Celery自带的监控工具,如Flower。
信号和钩子在任务执行前后执行额外逻辑。提供信号如pre_enqueuepre_execute使用Celery的事件和回调机制。
分布式支持任务分布在多个工作节点上执行。通过配置多个工作进程实现。内置支持分布式系统,可以跨多个节点运行任务。
消息代理中间件用于传递任务消息。可选,支持多种后端如Redis。依赖于外部的消息代理,如RabbitMQ或Redis。
定时任务定时执行任务的能力。支持cron表达式和固定间隔的调度。支持复杂的定时任务,通过Celery Beat进行调度。
容错性和持久性任务在执行过程中的容错处理。任务持久化到数据库,支持故障转移。支持任务持久化,具有强大的容错机制。
扩展性根据需要扩展任务处理能力。通过增加工作进程和利用多核处理器进行扩展。通过增加工作节点和使用消息代理进行水平扩展。
文档和社区支持项目文档的完整性和社区的活跃度。相对较新的库,文档和社区正在增长。成熟的库,拥有详尽的文档和活跃的社区支持

示例:给一个django-q的一个完整的示例

 在 Django 项目的 settings.py 文件中,添加 django_qINSTALLED_APPS

INSTALLED_APPS = [
    # ...
    'django_q',
    # ...
]

 接着,你可以配置 django-q 使用不同的后端,例如使用默认的数据库后端:

DJANGO_Q = {
    'default': 'django_q.db.models',  # 使用 Django ORM 作为队列后端
    'redis': {
        'BACKEND': 'django_q.backends.redis.RedisBackend',
        'OPTIONS': {
            'host': 'localhost',
            'port': 6379,
            'db': 0,
            'password': '',
        }
    },
    # 可以配置其它后端...
}

使用过程:

   1.创建任务

 创建一个任务函数,该函数将作为队列任务执行:

from django_q.models import Task, SUCCESS, FAILURE

def my_task():
    # 任务代码
    try:
        # 执行任务
        print("Task is running")
        return SUCCESS
    except Exception as e:
        return FAILURE, str(e)

   2. 安排任务

使用 schedule 方法安排任务:

from django_q.models import Task

Task.function(my_task).enqueue()

   或者,安排一个定时任务

from django_q.models import Task
from datetime import datetime, timedelta

scheduled_time = datetime.now() + timedelta(seconds=30)
Task.function(my_task).schedule(scheduled_time)

   3.运行队列工作者

 使用以下命令启动一个队列工作者:

python manage.py qcluster

   4.查看任务状态

   可以查看任务的状态,例如:

from django_q.models import Task

task = Task.objects.get(id=1)
if task.status == SUCCESS:
    print("Task succeeded!")
else:
    print("Task failed!")

    5.重试失败的任务

  如果任务失败,可以重试:

task.retry()

     6.使用信号

 django-q 提供了信号,允许你在任务开始、结束或失败时执行自定义逻辑。

from django_q import signals

def task_started(sender, task, **kwargs):
    print('Task started:', task)

signals.pre_save.connect(task_started)

注意事项:

  • 队列工作者需要运行在你的服务器上,以监听并执行任务。
  • 根据你的项目需求,可能需要配置多个工作者。
  • django-q 也支持 Django 管理命令,如 qinit 初始化数据库、qstop 停止工作者等。

 通过使用 django-q,你可以在 Django 应用中轻松地实现后台任务处理,而无需复杂的设置。

 24.Django 邮件支持

Django提供了一个强大的邮件支持系统,允许开发者发送电子邮件。以下是Django邮件支持的关键特性和配置的总结表格:

特性描述示例
邮件后端Django支持多种邮件后端,如SMTP、文件系统或内存缓存。EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
SMTP邮件服务器配置SMTP服务器的详细信息,包括邮箱地址、密码等。EMAIL_HOST = 'smtp.example.com'
邮件发送用于发送邮件的函数。django.core.mail.send_mail(subject, message, from_email, recipient_list, fail_silently=False)
HTML邮件发送HTML格式的邮件。django.core.mail.send_html_mail(subject, message, from_email, recipient_list, html_message=html_content, fail_silently=False)
附件向邮件添加附件。django.core.mail.EmailMessage.attach_file(filename)
邮件模板使用Django模板系统生成邮件内容。使用django.template.loader.render_to_string生成邮件模板内容
邮件优先级设置邮件的优先级。django.core.mail.EmailMessage.priority
邮件头部自定义邮件的头部信息。django.core.mail.EmailMessage.extra_headers
邮件队列Django可以将邮件排队,稍后一起发送以提高性能。django.core.mail.get_connection().send_messages(emails)
邮件后端设置配置邮件后端的额外选项,如使用TLS或SSL。EMAIL_USE_TLS = True
默认从邮箱设置默认发送邮件的邮箱地址。EMAIL_HOST_USER = 'user@example.com'
密码如果SMTP服务器需要认证,设置邮箱的密码。EMAIL_HOST_PASSWORD = 'yourpassword'
邮件主题和收件人设置邮件的“主题”和收件人列表。send_mail('Subject', 'Message', 'from@example.com', ['to@example.com'], fail_silently=False)

 示例:

以下是如何使用Django发送邮件的示例:

  1. 配置邮件后端:在settings.py中配置邮件后端和SMTP服务器信息。
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.example.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'user@example.com'
EMAIL_HOST_PASSWORD = 'yourpassword'

     2.发送邮件:在视图或模型中发送邮件。

from django.core.mail import send_mail
from django.template.loader import get_template
from django.utils.html import strip_tags

# 发送简单邮件
send_mail(
    'Subject here',
    'Here is the message.',
    'from@example.com',
    ['to@example.com'],
    fail_silently=False,
)

# 使用模板发送邮件
template = get_template('emails/welcome_email.html')
context = {'name': 'xiaomifeng1010'}
message = template.render(context)
send_mail(
    'Welcome!',
    strip_tags(message),
    'from@example.com',
    ['to@example.com'],
    html_message=message,
)

     3. 邮件模板:创建一个HTML邮件模板文件welcome_email.html

<!DOCTYPE html>
<html>
<head>
    <title>Welcome Email</title>
</head>
<body>
    <h1>Hello {{ name }},</h1>
    <p>Welcome to our site!</p>
</body>
</html>

 通过以上步骤,你可以在Django应用中实现邮件发送功能。邮件支持对于用户注册、密码重置、通知提醒等场景非常重要。

内容太多,分成了两部分,下一部分主要聚焦于总结Django整合多种认证方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/589590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpirngBoot整合快递100

目录 一、注册快递100 二、技术文档地址 三、需要认证的key和comcumer 四、spring boot 整合快递 100使用 4.1 引入快递100和hutool的依赖 4.2 将key和comcumer写入application.properties文件中 4.3 新建一个modle,用于将查出来的json数据转成对象 4.4 新建一个controll…

golang 基础知识细节回顾

之前学习golang的速度过于快&#xff0c;部分内容有点囫囵吞枣的感觉&#xff0c;写gorm过程中有很多违反我常识的地方&#xff0c;我通过复习去修正了我之前认知错误和遗漏的地方。 itoa itoa自增的作用在编辑error code时候作用很大&#xff0c;之前编辑springboot的error c…

python从0开始学习

目录 前言 1、print函数 2、input函数 3、保留字和标识符 总结 前言 本篇文章我们开辟一个新的学习模块&#xff1a;python。python是一个十分简洁实用的编程语言&#xff0c;我们将从0开始学习python 1、print函数 print(*args, sep , end\n, fileNone, flushFalse) pytho…

2024五一数学建模C题煤矿深部开采冲击地压危险预测原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024五一数学建模竞赛C题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024五一数学建模C题完整原创论文讲解&#xff0c;手把手保姆级教学&#xff01;_哔哩哔哩_bilibili 202…

[1678]旅游景点信息Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 旅游景点信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

在idea中连接mysql

IDE&#xff08;集成开发环境&#xff09;是一种软件应用程序&#xff0c;它为开发者提供编程语言的开发环境&#xff0c;通常集成了编码、编译、调试和运行程序的多种功能。一个好的IDE可以大幅提高开发效率&#xff0c;尤其是在进行大型项目开发时。IDE通常包括以下几个核心组…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新&#xff0c;以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 精酿啤酒品牌私域执行运营的内容策划&#xff0c;涉及以下几个…

在做题中学习(48):朴素的二分查找

. - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a; 暴力求解 for循环中&#xff0c;从nums[0]枚举到nums[n-1]&#xff0c;依次判断&#xff0c;返回 target的值。 时间复杂度 : O(N) :因为要遍历一遍数组 解法二&#xff1a;二分查找 因为此数组为有序的…

利用Github发现优质的学习项目网址

1. 直接搜索&#xff0c;star的数量越多的项目质量越高 2.Github Trending 地址: https://github.com/trending 3. Gitstar Ranking 地址: https://gistar-ranking.com/ 4. Awesome Topic 地址: https://github.com/topics/awesome

FIFO Generate IP核使用——Data Counts页详解

在Vivado IDE中&#xff0c;当看到一个用于设置数据计数选项的选项卡时&#xff0c;需要注意的是&#xff0c;尽管某些选项值可能因为当前的配置而显示为灰色&#xff08;即不可选或已禁用&#xff09;&#xff0c;但IDE中显示的有效范围值实际上是你可以选择的真实值。即使某些…

静态库、动态库回顾

回顾一下库相关的知识点&#xff0c;总结备忘一下。在某种情况下&#xff0c;你有了如下的代码&#xff0c;结构如下 //pra.h #include <stdio.h> void test_01(); //pra.c #include "pra.h" void test_01() {printf("xxxxxxx----->%s %s()\n",…

莫比乌斯变换的数学原理

一、说明 关于莫比乌斯变换&#xff0c;是一个代数几何变换的重要概念。也是双曲几何的重要理论&#xff0c;比如庞加莱盘就是建立在这个理论上&#xff0c;那么这个变换到底有哪些内容&#xff1f;本文将做出详细的解读。 二、线性变换和逆变换 在本节中&#xff0c;我们研…

# notepad++ 编辑器英文版,如何打开自动换行

notepad 编辑器英文版&#xff0c;如何打开自动换行 在Notepad中&#xff0c;如果你想要开启自动换行功能&#xff0c;可以按照以下步骤操作&#xff1a; 1、打开 Notepad 编辑器。 1.1. 依次点击菜单栏中的【视图】&#xff0c;英文版对应【View】。1.2. 在【视图】下拉菜单…

css---浮动知识点精炼汇总

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 浮动简单理解与介绍 这是我们普通的页面标签效果。 每个标签从上到下依次排列。 浮动顾名思义就是让这个标签飞翔起来。 他飞起来后&#xff0c;后面的标签来到他的位置上。 而浮动的标签就会显示在标签的上面。…

【译】Celery文档1:First Steps with Celery——安装和配置Celery

https://docs.celeryq.dev/en/stable/getting-started/first-steps-with-celery.html#first-steps Celery的第一步 Celery时一个自带电池的任务队列。 本教程内容&#xff1a; 安装消息传输代理(broker)安装Celery并创建第一个任务(task)启动Celery工作进程(worker)并执行任务…

2021-10-21 51单片机两位数码管显示0-99循环

缘由单片机两位数码管显示0-99循环-编程语言-CSDN问答 #include "REG52.h" #include<intrins.h> sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; sbit bpP3^4; bit k1,wk10,wk20; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,1…

Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解

目录 什么是分代收集算法 GC的分类和专业术语 什么是垃圾收集器 垃圾收集器的分类及组合 ​编辑 应关注的核心指标 Serial和ParNew收集器原理 Serial收集器 ParNew收集器 Parallel和CMS收集器原理 Parallel 收集器 CMS收集器 新一代垃圾收集器G1和ZGC G1垃圾收集器…

设计模式之MVC模式

在编程江湖闯荡多年&#xff0c;我手中打磨过的设计模式多如繁星&#xff0c;但论及经典与实用&#xff0c; MVC&#xff08;Model-View-Controller&#xff09;模式 绝对是个中翘楚&#xff01;它不仅是Web应用的骨架&#xff0c;更是软件架构的智慧结晶。今天&#xff0c;咱们…

DRF解析器源码分析

DRF解析器源码分析 1 解析器 解析请求者发来的数据&#xff08;JSON&#xff09; 使用 request.data 获取请求体中的数据。 这个 reqeust.data 的数据怎么来的呢&#xff1f;其实在drf内部是由解析器&#xff0c;根据请求者传入的数据格式 请求头来进行处理。 drf默认的解…

leetcode刷题记录—回溯

目录 22. 括号生成 39. 组合总和 46. 全排列 77. 组合 79. 单次搜索 回溯全集 22. 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[&qu…
最新文章