django从入门到实战(二)——FBV视图先容

打印 上一主题 下一主题

主题 1046|帖子 1046|积分 3138

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 Django 中,视图是处理 HTTP 哀求并返回 HTTP 响应的核心部分。Django 提供了两种主要的视图实现方式:FBV(Function-Based View)和 CBV(Class-Based View)。下面将详细先容这两种视图的语法、要义和使用方法。
1. FBV(Function-Based View)

1.1 定义与要义

FBV 是使用普通的 Python 函数来定义视图。它是 Django 中最根本的视图范例,适合处理简单的哀求和响应逻辑。FBV 的长处在于其简单性和直接性,易于理解和使用。
1.2 语法

FBV 的根本语法如下:
  1. from django.http import HttpResponse
  2. from django.shortcuts import render
  3. def my_view(request):
  4.     # 处理请求逻辑
  5.     if request.method == 'GET':
  6.         # 处理 GET 请求
  7.         return HttpResponse("Hello, World!")
  8.     elif request.method == 'POST':
  9.         # 处理 POST 请求
  10.         return HttpResponse("Data submitted!")
复制代码
1.3 使用方法


  • 定义视图
    在 views.py 文件中定义视图函数。
    1. # myapp/views.py
    2. from django.http import HttpResponse
    3. from django.shortcuts import render
    4. def home(request):
    5.     return render(request, 'home.html')  # 渲染首页模板
    6. def about(request):
    7.     return HttpResponse("关于我们")  # 返回简单的文本响应
    复制代码
  • 配置 URL
    在 urls.py 文件中配置 URL 路由。
    1. # myapp/urls.py
    2. from django.urls import path
    3. from . import views
    4. urlpatterns = [
    5.     path('', views.home, name='home'),  # 首页
    6.     path('about/', views.about, name='about'),  # 关于页面
    7. ]
    复制代码
  • 创建模板(例如 home.html):
    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <title>首页</title>
    6. </head>
    7. <body>
    8.     <h1>欢迎来到我的博客</h1>
    9.     <a href="{% url 'about' %}">关于我们</a>
    10. </body>
    11. </html>
    复制代码
1.4 优缺点



  • 长处

    • 简单易懂,适合初学者。
    • 机动性高,可以自由编写逻辑。

  • 缺点

    • 随着应用复杂度增长,FBV 可能导致代码重复和难以维护。
    • 不支持面向对象的设计模式。

2. CBV(Class-Based View)

2.1 定义与要义

CBV 是使用 Python 类来定义视图。它提供了一种更结构化的方式来处理哀求和响应,支持面向对象的编程风格。CBV 通过继承和方法重写来实现视图逻辑的复用和扩展。
2.2 语法

CBV 的根本语法如下:
  1. from django.views import View
  2. from django.http import HttpResponse
  3. class MyView(View):
  4.     def get(self, request):
  5.         return HttpResponse("Hello, World!")
  6.     def post(self, request):
  7.         return HttpResponse("Data submitted!")
复制代码
2.3 使用方法


  • 定义视图
    在 views.py 文件中定义视图类。
    1. # myapp/views.py
    2. from django.views import View
    3. from django.shortcuts import render
    4. from django.http import HttpResponse
    5. class HomeView(View):
    6.     def get(self, request):
    7.         return render(request, 'home.html')  # 渲染首页模板
    8. class AboutView(View):
    9.     def get(self, request):
    10.         return HttpResponse("关于我们")  # 返回简单的文本响应
    复制代码
  • 配置 URL
    在 urls.py 文件中配置 URL 路由。
    1. # myapp/urls.py
    2. from django.urls import path
    3. from .views import HomeView, AboutView
    4. urlpatterns = [
    5.     path('', HomeView.as_view(), name='home'),  # 首页
    6.     path('about/', AboutView.as_view(), name='about'),  # 关于页面
    7. ]
    复制代码
  • 创建模板(例如 home.html):
    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <title>首页</title>
    6. </head>
    7. <body>
    8.     <h1>欢迎来到我的博客</h1>
    9.     <a href="{% url 'about' %}">关于我们</a>
    10. </body>
    11. </html>
    复制代码
2.4 优缺点



  • 长处

    • 支持面向对象的编程,便于代码复用和扩展。
    • 可以通过继承和混入(Mixin)来组合不同的功能。
    • 提供了许多内置的通用视图(如 ListView、DetailView 等),可以快速实现常见功能。

  • 缺点

    • 对于简单的视图,CBV 可能显得过于复杂。
    • 学习曲线相对较陡,特别是对于初学者。

FBV 和 CBV 各有优缺点,选择使用哪种视图取决于具体的应用需求和开发者的偏好。对于简单的应用,FBV 可能更合适;而对于复杂的应用,CBV 提供了更好的结构和复用性。相识这两种视图的特点和使用方法,可以资助开发者在 Django 项目中做出更合适的选择。
3:设置响应方式

在 Django 中,响应是视图处理哀求后返回给客户端的内容。Django 提供了多种响应范例,以满足不同的需求。以下是关于怎样设置响应方式、响应范例、异常响应以及文件下载的详细先容。
1. 响应范例

Django 提供了多种响应范例,最常用的包括:


  • HttpResponse:最根本的响应范例,用于返回简单的文本或 HTML 内容。
  • JsonResponse:用于返回 JSON 格式的数据,适合 API 开发。
  • HttpResponseRedirect:用于重定向到另一个 URL。
  • FileResponse:用于返回文件下载。
  • StreamingHttpResponse:用于流式响应,适合大文件下载或及时数据流。
1.1 使用 HttpResponse

  1. from django.http import HttpResponse
  2. def my_view(request):
  3.     return HttpResponse("Hello, World!")  # 返回简单的文本响应
复制代码
1.2 使用 JsonResponse

  1. from django.http import JsonResponse
  2. def my_view(request):
  3.     data = {'key': 'value'}
  4.     return JsonResponse(data)  # 返回 JSON 格式的数据
复制代码
1.3 使用 HttpResponseRedirect

  1. from django.http import HttpResponseRedirect
  2. def my_view(request):
  3.     return HttpResponseRedirect('/another-url/')  # 重定向到另一个 URL
复制代码
1.4 使用 FileResponse

  1. from django.http import FileResponse
  2. def download_file(request):
  3.     file_path = 'path/to/your/file.txt'
  4.     response = FileResponse(open(file_path, 'rb'))
  5.     response['Content-Disposition'] = 'attachment; filename="file.txt"'  # 设置下载文件名
  6.     return response
复制代码
1.5 使用 StreamingHttpResponse

  1. from django.http import StreamingHttpResponse
  2. def stream_large_file(request):
  3.     def file_iterator(file_name, chunk_size=512):
  4.         with open(file_name, 'rb') as f:
  5.             while True:
  6.                 chunk = f.read(chunk_size)
  7.                 if not chunk:
  8.                     break
  9.                 yield chunk
  10.     response = StreamingHttpResponse(file_iterator('large_file.txt'))
  11.     response['Content-Type'] = 'text/plain'
  12.     return response
复制代码
2. 异常响应

在 Django 中,可以使用 HttpResponse 或 JsonResponse 来返回异常响应。通常情况下,使用 HTTP 状态码来指示错误范例。
2.1 返回 404 错误

  1. from django.http import HttpResponseNotFound
  2. def my_view(request):
  3.     return HttpResponseNotFound("页面未找到")  # 返回 404 锁定响应
复制代码
2.2 返回 500 错误

  1. from django.http import HttpResponseServerError
  2. def my_view(request):
  3.     return HttpResponseServerError("服务器内部错误")  # 返回 500 锁定响应
复制代码
3. Django 的文件下载

Django 提供了 FileResponse 类来处理文件下载。可以通过设置 Content-Disposition 响应头来指定文件下载的名称。
文件下载示例

  1. from django.http import FileResponse
  2. def download_file(request):
  3.     file_path = 'path/to/your/file.txt'
  4.     response = FileResponse(open(file_path, 'rb'))
  5.     response['Content-Disposition'] = 'attachment; filename="file.txt"'  # 设置下载文件名
  6.     return response
复制代码
4:HTTP 哀求对象

在 Django 中,HTTP 哀求对象包罗了客户端发送的全部哀求信息。可以通过 request 参数在视图中访问哀求对象。
1. 哀求方式范例

Django 支持多种 HTTP 哀求方式,主要包括:


  • GET:用于哀求数据,通常用于获取资源。
  • POST:用于提交数据,通常用于创建或更新资源。
  • PUT:用于更新资源(不常用,通常在 RESTful API 中使用)。
  • DELETE:用于删除资源(不常用,通常在 RESTful API 中使用)。
  • PATCH:用于部分更新资源(不常用,通常在 RESTful API 中使用)。
2. 获取哀求信息

可以通过 request 对象获取哀求的各种信息:


  • 哀求方法:request.method 获取哀求方法(如 GET、POST)。
  • 哀求路径:request.path 获取哀求的 URL 路径。
  • 查询参数:request.GET 获取 GET 哀求的查询参数。
  • 表单数据:request.POST 获取 POST 哀求的表单数据。
  • 文件数据:request.FILES 获取上传的文件。
示例

  1. from django.http import JsonResponse
  2. def my_view(request):
  3.     if request.method == 'GET':
  4.         # 获取查询参数
  5.         param = request.GET.get('param', 'default_value')
  6.         return JsonResponse({'param': param})
  7.     elif request.method == 'POST':
  8.         # 获取表单数据
  9.         data = request.POST.get('data', 'default_data')
  10.         return JsonResponse({'data': data})
复制代码
3. 文件上传实现

在 Django 中,可以通过 request.FILES 获取上传的文件。通常必要在 HTML 表单中设置 enctype="multipart/form-data"。
示例


  • HTML 表单
  1. <form method="post" enctype="multipart/form-data">
  2.     {% csrf_token %}
  3.     <input type="file" name="myfile">
  4.     <button type="submit">上传</button>
  5. </form>
复制代码

  • 视图处理文件上传
  1. from django.http import JsonResponse
  2. def upload_file(request):
  3.     if request.method == 'POST':
  4.         uploaded_file = request.FILES['myfile']
  5.         # 处理文件(保存、读取等)
  6.         with open('path/to/save/' + uploaded_file.name, 'wb+') as destination:
  7.             for chunk in uploaded_file.chunks():
  8.                 destination.write(chunk)
  9.         return JsonResponse({'message': '文件上传成功'})
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表