2024-09-03

在Django中,我们可以使用内置的分页器(Paginator)来实现分页功能。以下是一个简单的示例,展示了如何在Django视图中使用Paginator来分页查询集:




from django.core.paginator import Paginator
from django.shortcuts import render
from .models import MyModel
 
def my_view(request):
    # 获取对象列表
    object_list = MyModel.objects.all()
    # 创建Paginator对象,每页显示10个对象
    paginator = Paginator(object_list, 10)
    # 从GET请求中获取页码
    page_number = request.GET.get('page')
    # 获取具体页码的Page对象
    page_obj = paginator.get_page(page_number)
    # 渲染页面
    return render(request, 'my_template.html', {'page_obj': page_obj})

在模板中,我们可以使用page_obj来显示分页信息和对象列表:




<ul>
{% for object in page_obj %}
    <li>{{ object }}</li>
{% endfor %}
</ul>
 
<!-- 分页导航 -->
<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; 首页</a>
            <a href="?page={{ page_obj.previous_page_number }}">&lsaquo; 上一页</a>
        {% endif %}
 
        <span class="current">
            第 {{ page_obj.number }} 页 / 共 {{ page_obj.paginator.num_pages }} 页
        </span>
 
        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">下一页 &rsaquo;</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">尾页 &raquo;</a>
        {% endif %}
    </span>
</div>

这个例子展示了如何在Django视图中创建Paginator对象,并在模板中显示对象列表和分页导航。

2024-09-03

Django的MTV模式是一种分离业务逻辑的方法,它包含以下三个部分:

  1. Model:定义了数据表示及其行为的类,代表应用的数据库模型。
  2. Template:定义了如何展示数据的布局和样式,用于渲染HTML。
  3. View:包含了应用的业务逻辑,连接URL配置,模型和模板。

以下是一个简单的Django视图函数示例,它展示了如何使用Django的MTV模式处理HTTP请求:




from django.http import HttpResponse
from .models import MyModel  # 假设有一个MyModel数据模型
 
def my_view(request):
    # 业务逻辑
    objects = MyModel.objects.all()  # 获取所有MyModel实例
    # ... 其他业务逻辑
 
    # 返回响应
    return HttpResponse('<html><body>Hello, World!</body></html>')

在这个例子中,my_view函数是视图层的一部分,它处理用户请求,执行数据库操作,并最终返回一个HTTP响应。这个简单的函数展示了Django视图如何工作的基本框架。

2024-09-03



# 导入Django模块
from django.urls import reverse
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
 
# 定义用户模型
class CustomUser(AbstractUser):
    # 添加额外的字段,例如用户生日
    birth_date = models.DateField(null=True, blank=True, verbose_name=_('birth date'))
 
    # 定义用户的字符串表示
    def __str__(self):
        return self.username
 
    # 定义用户的个人资料URL
    def get_absolute_url(self):
        return reverse('users:detail', kwargs={'username': self.username})
 
# 注册模型

这个代码示例展示了如何扩展Django的内置用户模型AbstractUser来添加额外的字段,并且演示了如何定义用户模型的字符串表示和个人资料URL。这是构建用户身份验证系统的一个基本且常见的需求。

2024-09-03



from django.shortcuts import render, redirect
from .models import UserProfile
 
def user_list(request):
    users = UserProfile.objects.all()  # 获取所有用户
    return render(request, 'user_list.html', {'users': users})  # 渲染用户列表页面
 
def add_user(request):
    if request.method == 'POST':
        # 处理POST请求,添加用户逻辑
        username = request.POST['username']
        email = request.POST['email']
        UserProfile.objects.create(username=username, email=email)
        return redirect('user_list')  # 重定向到用户列表页面
 
    return render(request, 'add_user.html')  # 渲染添加用户页面

在这个例子中,我们定义了两个视图函数:user_listadd_useruser_list 函数获取所有用户并渲染到 user_list.html 页面。add_user 函数处理添加用户的表单提交,并在成功后重定向回用户列表页面。这是一个简单的用户管理示例,展示了如何在Django中使用数据库模型和视图函数来处理数据和页面的显示。

2024-09-03



from django.core.exceptions import PermissionDenied
from django.http import HttpRequest
from django_ratelimit.decorators import ratelimit
 
# 定义速率限制装饰器
def rate_limit_decorator(request: HttpRequest, key: str, rate: str):
    # 使用django-ratelimit的ratelimit装饰器
    @ratelimit(key=key, rate=rate, method=request.method)
    def decorated_view(view_func):
        # 装饰器内的视图函数
        def wrapped_view(request, *args, **kwargs):
            response = view_func(request, *args, **kwargs)
            # 检查是否超出速率限制
            if getattr(response, 'rate_limited', False):
                raise PermissionDenied("请求过于频繁,请稍后再试。")
            return response
        return wrapped_view
    return decorated_view
 
# 使用示例
@rate_limit_decorator(request=request, key='ip', rate='10/m')
def my_view(request):
    # 你的视图逻辑
    pass

这个示例代码定义了一个名为rate_limit_decorator的函数,它接受一个请求对象、限制键和速率字符串作为参数,并返回一个装饰器。这个装饰器使用django-ratelimit库提供的ratelimit装饰器来实现速率限制。如果请求超过了限制,会抛出一个PermissionDenied异常。这个示例展示了如何在Django视图中使用速率限制装饰器。

2024-09-03

在Django中使用Form组件,你需要遵循以下步骤:

  1. 定义一个Form类,继承自django.forms.Form
  2. 在这个类中定义字段,每个字段对应表单中的一个输入元素。
  3. 使用Django提供的模板标签来渲染表单。

下面是一个简单的例子:




# forms.py
from django import forms
 
class ContactForm(forms.Form):
    name = forms.CharField(label='Your name', max_length=100)
    email = forms.EmailField(label='Your email')
    message = forms.CharField(widget=forms.Textarea)

在视图中处理表单数据:




# views.py
from django.shortcuts import render
from .forms import ContactForm
 
def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            print(form.cleaned_data)
        else:
            # 表单验证失败
            print(form.errors)
    else:
        form = ContactForm()
 
    return render(request, 'contact.html', {'form': form})

最后,在HTML模板中渲染表单:




<!-- contact.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
</form>

这个例子展示了如何创建一个简单的联系表单,并在视图中处理用户输入。当表单提交并验证通过时,你可以在视图中获取清洁的数据并进行进一步处理。

2024-09-03

Django是一个开放源代码的Web应用框架,用Python编写。它遵循模型-视图-控制器(MVC)模式,但是在Django中通常被认为是模型-视图-模板(MVT)模式,因为它引入了模板Template的概念。

Django的核心组件包括:

  1. 模型(Model):定义应用程序的数据类型。
  2. 视图(View):处理用户请求和生成响应。
  3. 模板(Template):封装如何展示内容(HTML)。
  4. 表单(Form):用于收集用户输入数据。
  5. 路由(URL):定义应用中的路径。
  6. 会话(Session):用户会话数据。
  7. 缓存(Cache):缓存机制。
  8. 中间件(Middleware):提供一个简单的机制来扩展请求和响应。
  9. 认证系统(Authentication System):提供用户登录认证。

以下是一个简单的Django模型示例:




from django.db import models
 
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
 
    def __str__(self):
        return f'{self.first_name} {self.last_name}'

这个模型定义了一个Person类,它有两个字段:first_namelast_name__str__方法定义了当模型实例被转换为字符串时的表现形式。

在Django中,你可以通过以下命令创建一个新的项目:




django-admin startproject myproject

然后,你可以运行以下命令来启动开发服务器:




python manage.py runserver

以上是Django核心概念的简要介绍和一个简单的模型示例。

2024-09-03

Django视图层通常使用类视图或者函数视图来实现。以下是一些常用的编写视图的方法和模式:

  1. 使用函数视图:



from django.http import HttpResponse
 
def my_view(request):
    return HttpResponse('Hello, World!')
  1. 使用类视图:



from django.http import HttpResponse
from django.views import View
 
class MyView(View):
    def get(self, request):
        return HttpResponse('Hello, World!')
  1. 使用基于类的通用视图(Generic Class-Based Views):



from django.views import generic
 
class MyListView(generic.ListView):
    model = MyModel
    template_name = 'my_template.html'
 
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['my_data'] = 'extra data'
        return context
  1. 使用装饰器来处理通用的任务,比如登录验证:



from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
 
@login_required
def my_view(request):
    return HttpResponse('Hello, World!')
  1. 使用mixins来组合不同的行为,比如列表视图和创建视图:



from django.views import generic
 
class MyListView(generic.ListView):
    model = MyModel
    template_name = 'my_template.html'
 
class MyCreateView(generic.CreateView):
    model = MyModel
    fields = ['field1', 'field2']
    success_url = '/success/'

以上代码展示了如何在Django中编写基本的视图。这些是Django开发者需要掌握的基础技能。

2024-09-03

以下是一个简单的Django API接口示例。假设您已经安装了Django,并在Pycharm中创建了一个新项目和一个新的应用。

  1. 首先,在您的Django项目的settings.py文件中添加rest_frameworkINSTALLED_APPS



INSTALLED_APPS = [
    # ...
    'rest_framework',
]
  1. 定义一个新的模型(例如models.py)。



from django.db import models
 
class MyModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
  1. 运行迁移来创建数据库表。



python manage.py makemigrations
python manage.py migrate
  1. 在应用目录中创建一个新的serializers.py文件,并定义一个序列化器。



from rest_framework import serializers
from .models import MyModel
 
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'
  1. 在应用目录中创建一个新的views.py文件,并定义一个视图。



from rest_framework import generics
from .models import MyModel
from .serializers import MyModelSerializer
 
class MyModelListCreate(generics.ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
  1. 在应用的urls.py文件中添加路由。



from django.urls import path
from .views import MyModelListCreate
 
urlpatterns = [
    path('mymodel/', MyModelListCreate.as_view()),
]
  1. 在项目的urls.py文件中包含应用的urls。



from django.urls import include, path
urlpatterns = [
    # ...
    path('myapp/', include('myapp.urls')),
]
  1. 运行开发服务器。



python manage.py runserver

现在您已经有了一个简单的Django API接口,可以通过访问 http://127.0.0.1:8000/myapp/mymodel/ 来测试您的API。您可以使用Postman、curl或任何其他HTTP客户端来与API交互。

2024-09-03

Django:

优点:

  • 大而全的Web框架,提供了丰富的功能,如ORM、模板、表单等,易于开发和维护。
  • 广泛的社区支持,有大量的第三方应用和扩展。
  • 自带的管理后台。
  • 安全性和稳定性在历史项目中得到验证。

缺点:

  • 对于复杂的应用,配置相对复杂。
  • 对于大型应用,可能会显得繁重。
  • 如果不使用其ORM和模板,可能会感到冗余。

适用场景:

  • 需要快速开发的中小型Web应用。
  • 需要完整解决方案的企业级Web应用。
  • 需要用户管理、认证和权限的应用。

Flask:

优点:

  • 轻量级的框架,易于学习和上手。
  • 极高的灵活性,可以自定义几乎所有功能。
  • 丰富的第三方扩展,如果Django自带的功能不满足需求,可以使用Flask扩展。

缺点:

  • 相对于Django而言,缺乏一定程度的“开箱即用”体验。
  • 需要配置许多第三方扩展来实现完整的Web应用功能。

适用场景:

  • 需要高度灵活性和可定制性的应用。
  • 不需要复杂的数据库管理或用户管理的应用。
  • 想要精简代码和资源的应用。

FastAPI:

优点:

  • 快速的性能,基于Starlette框架,是最快的Python Web框架之一。
  • 代码自动完成,提高开发效率。
  • 使用Python 3.6+类型注解,提供强大的IDE支持。
  • 支持异步编程,适合现代Web应用。
  • 提供了强大的API文档工具,如OpenAPI。

缺点:

  • 相对不受开发者完全信任,社区支持相对不如Django和Flask广泛。
  • 对于不熟悉异步编程或不熟悉类型注解的开发者可能需要学习曲线。

适用场景:

  • 需要快速开发和部署API的场景。
  • 需要处理大量并发请求的场景。
  • 需要使用现代Web特性,如异步支持的场景。
  • 需要强类型语言支持和IDE优化的场景。