Django之视图

这篇具有很好参考价值的文章主要介绍了Django之视图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一)文件与文件夹

当我们设定好一个Djiango项目时,里面会有着view.py等文件,也就是文件的方式:
Django之视图,Django架构,django,数据库,sqlite
那么我们在后续增加app等时,view.py等文件会显得较为臃肿,当然也根据个人习惯,这时我们可以使用文件夹的方式:
原本我的views.py中有着这些函数:
Django之视图,Django架构,django,数据库,sqlite
现在我在web的app下命名一个views的文件夹并且在这个文件夹中创建同名的py文件:
Django之视图,Django架构,django,数据库,sqlite
那么使用方法其实并无特别大的改动,只是导入包是需要具体指定:
Django之视图,Django架构,django,数据库,sqlite
我们可以多个关联的方法(def)对应着一个py页面就好,这种文件夹的方法我个人觉得适合用于一个app有多个复杂功能有着较多url的场景,这样可以具体的指定方法,也方便我们检查方法代码是否有错误。

二)相对与绝对导入

这个问题其实追求本质就是相对路径与绝对路径。
相对路径:
Django之视图,Django架构,django,数据库,sqlite
绝对路径:
Django之视图,Django架构,django,数据库,sqlite
那么在这里我们需要注意一个点,不可以在项目的根目录做相对导入。
那么相对导入对比于绝对导入来说,层级会更深层次些。
原因:相对路径比绝对路径层级深是因为相对路径是以当前文件为起点,通过层级关系描述目标文件的位置。相对路径需要根据文件自身的位置进行计算,所以在描述路径时需要考虑更多的层级关系,导致了层级深度的增加。而绝对路径是以根目录为起点,不受文件位置的限制,所以在描述路径时相对简单,不需要考虑层级关系。

三)视图参数

我们在创建方法时,都会以request为默认参数,你是否真的知道request到底时个什么含义呢?
我们先来了解对象,对象我们可以理解成包裹,包裹它可以放很多东西。那么request就是一个对象,它存放了浏览器发送给我们的所有内容:

  • 请求的相关所有的数据:当前访问的url,请求方式等…
  • django额外添加的数据

我们可以做一个方法来具体获取分析

from django.shortcuts import HttpResponse

def requ(request):
    # 1.当前URL  /api/login/
    print(request.path_info)

    # 2.URL传递的参数
    print(request.GET)
    print(request.GET.get("age"))

    # 3.请求方式  GET/POST
    print(request.method)

    # 4.如果post请求,传递请求体(原始数据)
    print(
        request.body)  # b'{"code":"083Sjmll2yla694F3bll2DguCM2SjmlG","unionId":"oP6QCsyT_9bk1dfSaVf0GEV5Y-yE"}'  b'v1=123&v2=456'

    # 4.1 请求体+请求头       b'v1=123&v2=456'  +  content-type:application/x-www-form-urlencoded
    print(request.POST)
    print(request.POST.get("v1"))
    print(request.POST.get("v2"))

    # 4.2 请求体+请求头   文件
    print(request.FILES)  # 文件格式           + multipart/form-data
    print(request.FILES.get("n1"))
    print(request.FILES.get("n2"))

    # 5.请求头
    # {'Content-Length': '', 'Content-Type': 'text/plain', 'Host': '127.0.0.1:8000', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'Sec-Ch-Ua': '" Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"', 'Sec-Ch-Ua-Mobile': '?0', 'Sec-Ch-Ua-Platform': '"macOS"', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7', 'Cookie': 'csrftoken=CdidpKSGbLxzmOXnbmlkvrZep1eJmKLAA81T73UjcjxEnMOa4YOZqtc849AkYfUy'}
    print(request.headers)

    # 5.1 请求头有个特殊的cookie
    # request.headers['cookie']  # 'csrftoken=CdidpKSGbLxzmOXnbmlkvrZep1eJmKLAA81T73UjcjxEnMOa4YOZqtc849AkYfUy;session=xxxx'
    # {'csrftoken': 'CdidpKSGbLxzmOXnbmlkvrZep1eJmKLAA81T73UjcjxEnMOa4YOZqtc849AkYfUy'}
    print(request.COOKIES)

    # 6.requests中其他值
    print(request.resolver_match)
    return HttpResponse('index')

Django之视图,Django架构,django,数据库,sqlite
运行后:
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite
可以看见给我们的控制台反馈了很全的网页源码等数据信息。

四)返回值

1.HttpResponse

格式:

HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)

响应体必须是字符串类型,第二个参数可以指定响应头中的相同数据,第三个数据就是可以指定状态码
例如:
Django之视图,Django架构,django,数据库,sqlite
结果:
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite

2.JsonResponse

JsonResponse其实算是HttpReponse的一个子类,用于返回json数据(用户端接收的数据)。若要返回json数据,可以使用JsonResponse来构造响应对象,作用是帮助我们将数据转换为json字符串,但是需要设置响应头Content-Type为application/json。
参考格式:

return JsonResponse(data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):

可以如此设置:

return JsonResponse(project_data, json_dumps_params={'ensure_ascii': False}, status=301)

在这个代码中,project_data 是作为响应的数据传递给 JsonResponse 函数。json_dumps_params={‘ensure_ascii’: False} 是为了确保在序列化 JSON 数据时不使用 ASCII 编码,以支持非 ASCII 字符。status=301 表示返回一个 HTTP 301 永久重定向的状态码。
1、第一个参数(data)可以直接传递字典或者嵌套字典的列表2、默认添加content_type为application/json3、默认第一个参数只能为字典,如果为嵌套字典的列表,必须设置safe=False。关掉安全模式
返回嵌套列表的时候,要这样写:

 return JsonResponse(project_data_list, safe=False)
3.redirect(重定向)

redirect可以让我们的访问转移到设定上的网站,例如:
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite
那么当我在浏览器访问url为red/时,网站会自动跳转到百度首页

4.渲染html页面

格式:

render(request,"网址路径")

别误解,这个网址路径是在你的项目里需要展示的网站路径,我们需要现在主路由的setting.py文件中找到TEMPLATES的配置文件然后如下修改:
Django之视图,Django架构,django,数据库,sqlite
我们可以在每一个应用下设定一个templates文件夹来进行存放各自的html代码,但是如果想要在每一个应用下加上templates来进行查找,需要注册应用,也就是在setting.py中的insetalled——apps里。Django之视图,Django架构,django,数据库,sqlite
但是如果项目的app应用过多,存在着templates里的文件名字一样,会发生什么?在Django架构中,templates的优先级会以注册的app的顺序来。
如何解决?
我们只需要在应用的templates目录下创建一个以应用命名的文件夹存放就可以:
Django之视图,Django架构,django,数据库,sqlite
一般项目的公共的templates里面会存放整个项目所需要用到的html代码。
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite

五)FBV CBV

  • FBV,视图用函数的形式编写。(目前主流)
  • CBV,视图用类的形式编写。(前后端分离的项目中采用的方式)

FBV例子:
admin路由是django自带的一个后台管理系统,可以对model进行基础的增删查改
Django之视图,Django架构,django,数据库,sqlite

urlpatterns = [
    path('index/', index),
    path("pay/", pay),
    path("user/", User.as_view()),
#这里的User.as_view()是返回了一个闭包内的函数,这个函数就是用FBV方法写的函数
]

CBV例子:

from django.views import View

class User(View):

    def get(self, request):
        pass

    def post(self, request):
        pass

六)静态资源

那么静态资源其实分为两种

  1. 开发需要(css、js、图片)
  • 公共文件存储在根目录的/static/下
  • app所用存储在app目录下的/static/下
  1. 媒体文件-用户上传的数据(excel/pdf/video)
  • 存储在根目录的 /media/
1.静态文件

我们需要在主路由的setting.py中的最后加上如下内容:
Django之视图,Django架构,django,数据库,sqlite
在django查找时,其实是惰性查找,当它查找到符合条件的第一个文件就会停止。
在多个app开发时,会将各自的图片放在各自的/static/(app名)目录下
Django之视图,Django架构,django,数据库,sqlite
如何使用到?
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite
但是在开发过程中,禁止使用如下语句

<img src="/static/api/1.png">

建议使用{% static %}标签方式:

 <img src="{% static 'image/django.jpg' %">

Django之视图,Django架构,django,数据库,sqlite

2.媒体文件

访问媒体文件时我们需要在路由中加上媒体文件的配置:
Django之视图,Django架构,django,数据库,sqlite

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

不要忘记导入settings的包
Django之视图,Django架构,django,数据库,sqlite
Django之视图,Django架构,django,数据库,sqlite文章来源地址https://www.toymoban.com/news/detail-730257.html

到了这里,关于Django之视图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Django连接数据库

    Django连接数据库

    mysql -u root -p show databases; 在settings.py文件中进行配置和修改 在models.py文件中进行修改 创建表 执行命令: python manage.py makemigrations python manage.py migrate 条件:在setings保证app已经注册 删除表 当需要删除表时,则再models.py中注释表结构,然后重新执行命令即可。 修改表 新增列的

    2024年04月27日
    浏览(17)
  • [django] django好玩的地方在于,可以批量操作数据库了

    django好玩的地方在于,可以批量操作数据库了。 和数据库快速交互,真的是好厉害。 这种情况怎么过滤 objects.filter project = models.ForeignKey(to=“Project”, verbose_name=‘项目’, on_delete=models.CASCADE, max_length=50, null=False, help_text=‘项目’) mysql json类型的字段 models.JSONField 在django中是什

    2024年02月22日
    浏览(13)
  • Django连接多个数据库

    为了让不同业务的数据分离,落到不同的库,使用 django 连接多个数据库。 Django 使用 default 数据库,如果没有其他选择 default 可以没有,但是必须设置一个空字典 设置多个数据库,需要同步多次。这里比较麻烦。 迁移将会把所有model的所有表镜像的迁移到两个库,自带的指

    2024年02月11日
    浏览(11)
  • Django基本数据库操作

    Django基本数据库操作

    @ 目录 Django基本数据库操作 👨‍🏫内容一:基本数据库配置 👨‍🔬内容二:ORM基本操作 👉Django是一个流行的Python Web框架,它可以使用不同的数据库引擎来存储和管理数据。Django默认使用sqlite数据库,但是你也可以配置它使用mysql数据库。这里我将配置的是本地的Mysql数据

    2024年02月16日
    浏览(13)
  • Django迁移数据到指定数据库

    在Django中,你可以配置多个数据库,并且可以为不同的操作指定使用不同的数据库。这意味着你确实可以同时将数据保存到SQLite和MySQL数据库中,但这需要你在代码中明确指定每次数据库操作应使用哪个数据库。 首先,你需要在Django设置文件 settings.py 中定义两个数据库连接,

    2024年02月01日
    浏览(10)
  • Django dumpdata 迁移数据库数据

    本文介绍两种常用的 Django 服务迁移数据方法。 这两种方法都需要在新的服务器部署好数据库,创建好相应的数据库表和用户以后再进行。 针对数据量不是很大的项目,可以使用此方法,操作起来比较简单。 通过连接旧的数据库运行dumpdata导出命令导出数据。 连接上新的数

    2024年02月17日
    浏览(10)
  • Django中级指南:理解并实现Django的模型和数据库迁移

    Django 是一个极其强大的 Python Web 框架,它提供了许多工具和特性,能够帮助我们更快速、更便捷地构建 Web 应用。在本文中,我们将会关注 Django 中的模型(Models)和数据库迁移(Database Migrations)这两个核心概念。 在 Django 中,模型是一种特殊的对象,它对应数据库中的一张

    2024年02月13日
    浏览(9)
  • django添加数据库字段进行数据迁移

    django添加数据库字段进行数据迁移

    1.修改view.py里面的变量 2.在model.py新增字段 3.打开terminal并将环境切到项目所在环境,切换方式为 4.执行命令

    2024年02月09日
    浏览(18)
  • 7. Django 模型与数据库

    7. Django 模型与数据库

    7.1.1 定义模型 7.1.2 开发个人的ORM框架 7.1.3 数据迁移 7.1.4 数据导入与导出 7.2.1 一对一表关系 学生id(主键) 姓名 班级 教室 1001 张三 三年级一班 301 1002 李四 三年级二班 302 1003 王五 三年级三班 303 学生信息id(主键) 年龄 联系电话 外键 1001 301 0000-120 1001 1002 302 0000-121 1002 1003 303

    2024年04月23日
    浏览(35)
  • Django 数据库迁移反复出错

    Django 的数据库迁移有非常多问题,尤其是我们引入了一个维护了非常多年的大插件,比方说 wagtail。 这里总结一些常见问题和解决思路,我自己使用的是 MySQL(MariaDB) 首先说明一下 Django 数据迁移的机制 问题 : 1071, \\\'Specified key was too long; max key length is 767 bytes\\\' 解决 :最常见

    2023年04月19日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包