Django之视图

news2024/11/18 21:36:51

一)文件与文件夹

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

二)相对与绝对导入

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

三)视图参数

我们在创建方法时,都会以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')

image.png
运行后:
image.png
image.png
可以看见给我们的控制台反馈了很全的网页源码等数据信息。

四)返回值

1.HttpResponse

格式:

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

响应体必须是字符串类型,第二个参数可以指定响应头中的相同数据,第三个数据就是可以指定状态码
例如:
image.png
结果:
image.png
image.png

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可以让我们的访问转移到设定上的网站,例如:
image.png
image.png
那么当我在浏览器访问url为red/时,网站会自动跳转到百度首页

4.渲染html页面

格式:

render(request,"网址路径")

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

五)FBV CBV

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

FBV例子:
admin路由是django自带的一个后台管理系统,可以对model进行基础的增删查改
image.png

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中的最后加上如下内容:
image.png
在django查找时,其实是惰性查找,当它查找到符合条件的第一个文件就会停止。
在多个app开发时,会将各自的图片放在各自的/static/(app名)目录下
image.png
如何使用到?
image.png
image.png
image.png
image.png
但是在开发过程中,禁止使用如下语句

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

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

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

image.png

2.媒体文件

访问媒体文件时我们需要在路由中加上媒体文件的配置:
image.png

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

不要忘记导入settings的包
image.png
image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下ebtables和iptables

ebtables Ebtables has three tables: filter, nat and broute. The broute table has the BROUTING chain.The filter table has the FORWARD, INPUT and OUTPUT chains.The nat table has the PREROUTING, OUTPUT and POSTROUTING chains. iptables Tables↓/Chains→PREROU…

线上展示越发流行的今天,数字展厅发展有哪些趋势

引言&#xff1a; 二十一世纪的今天&#xff0c;数字化技术在不断的进步&#xff0c;数字展厅也逐渐出现在人们眼前&#xff0c;并成为了现代展示和推广的重要工具。 一&#xff0e;快速了解数字展厅 数字展厅是一种利用数字技术创建的虚拟展示空间&#xff0c;它通过虚拟现实…

Go-Ldap-Admin | Ldap 同步钉钉、企业微信、飞书组织架构实践和部分小坑

目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL&#xff1a;5.7数据库 安装openLDAP 修改域名&#xff0c;新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、…

GPT如何避免从入门到放弃(一)——认识GPT

第一讲&#xff1a;认识GPT GPT的全称&#xff1a;Generative Pre-trained Transformer——生成式 预训练 变换模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的大型语言模型。它由OpenAI开发&#xff0c;并在不同版本中不断…

QQ怎么上传大于1G的视频啊?视频压缩这样做

当我们想要在QQ上分享一段大容量的视频时&#xff0c;往往会因为超过1G的限制而感到无助。不过&#xff0c;不用担心&#xff0c;今天我们将为你介绍三种可以压缩视频大小的方法&#xff0c;一起来看看吧~ 一、嗨格式压缩大师 嗨格式压缩大师是一款专业的视频压缩软件&#xf…

Multisim14.0仿真(二十四)石英晶体多谐振荡器

一、仿真原理图&#xff1a; 二、仿真效果图&#xff1a;

基于Vue+ELement实现增删改查案例与表单验证

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

航天与航空的区别,今天终于弄清楚啦!

航天与航空的区别 一&#xff1a;什么是航天&#xff1f; 航天的由来 航天(Spaceflight)&#xff0c;又称空间飞行、太空飞行、宇宙航行或航天飞行&#xff0c;是指进入、探索、开发和利用太空(即地球大气层以外的宇宙空间&#xff0c;又称外层空间)以及地球以外天体各种活动…

Java高级应用——异常处理

文章目录 异常处理概念Java异常体系Error 和 Exception编译时异常和运行时异常Java异常处理的方式 异常处理 概念 异常处理是在程序执行过程中遇到错误或异常情况时的一种机制&#xff0c;它允许程序在错误发生时进行适当的处理&#xff0c;而不会导致程序崩溃或产生不可预测…

pdf怎么调整大小kb?pdf文件过大这样压缩

在日常的工作和生活中&#xff0c;我们常常会遇到需要调整PDF文件大小的问题。有时候&#xff0c;我们需要将大型的PDF文件上传到某些平台&#xff0c;但平台的限制让我们不得不压缩文件的大小。那么&#xff0c;如何有效地调整PDF文件的大小呢&#xff1f; 一、使用嗨格式压缩…

第三方开源测试框架 pytest

本篇文章是聊聊 Python 的单元测试框架&#xff0c;在Python 世界中最火的第三方单元测试框架&#xff1a;pytest。 它有如下主要特性&#xff1a; assert 断言失败时输出详细信息&#xff08;再也不用去记忆 self.assert* 名称了&#xff09;自动发现 测试模块和函数模块化夹…

ai智能写作软件,免费自动写作软件

无论你是一名热衷于撰写博客的博主&#xff0c;还是一位为企业撰写广告宣传的创意写手&#xff0c;都会面临一个共同的问题&#xff1a;时间和创意的压力。随着信息爆炸式增长&#xff0c;写作任务不仅变得更加频繁&#xff0c;还需要不断提供新的、有吸引力的内容&#xff0c;…

软考-计算机网络与系统安全

七层模型 网络技术标准与协议 TCP三次握手 DHCP协议&#xff1a;固定分配、动态分配和自动分配 DNS协议&#xff1a;递归查询&#xff0c;迭代查询 计算机网络分类 按分布范围&#xff1a; 局域网城域网广域网因特网 按拓扑结构分 总线型星型环型树型分布式 网络规划与设…

window.print()打印及出现的问题

<template><transition name"el-zoom-in-center"><div class"JNPF-preview-main"><div class"JNPF-common-page-header"><el-page-header back"goBack" :content"打印通知书" /><div clas…

护眼灯显色度越高越好吗?选儿童护眼台灯应该这样选

显色指数当然是越高越好了。LED灯作为一种新型的照明产品&#xff0c;具有节能、环保、寿命长等优点&#xff0c;受到越来越多的人们的青睐。但是&#xff0c;市面上的LED灯品牌琳琅满目&#xff0c;让人眼花缭乱。那么&#xff0c;LED灯什么牌子好呢&#xff1f;下面我们来推荐…

我们应该用什么酒袋来安全地运输葡萄酒?

无论是在朋友家、在公园还是在海滩&#xff0c;葡萄酒都会让每次聚会变得更美好。这时候运输葡萄酒就变得很有挑战性&#xff0c;你不仅有打破它们的危险&#xff0c;而且还可能因为暴露在高温或阳光下而伤害它们。来自来自云仓酒庄品牌雷盛红酒分享为了确保葡萄酒的安全到达&a…

leetCode 343.整数拆分 动态规划

给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解释: 10 3 …

Python实现IP的自动切换

一、安装所需库 在开始之前&#xff0c;我们首先需要确保已经安装了以下库&#xff1a; - requests&#xff1a;用于发送HTTP请求和获取网页内容。 - winreg&#xff1a;用于在Windows下访问和编辑注册表信息。 可以使用pip命令进行安装&#xff0c;例如&#xff1a; pip i…

PayPal面经

文章目录 初战AI Infra团队广泛收集信息&#xff0c;增加对面试相关团队的了解Paypal的AI infra Engineer 极客时间演讲视频&#xff1a;AI在金融应用HR面试首面 zhang chao首先让我介绍自己和项目基础知识出题 lettcode 1and0s 二面 luwen没有让我重复介绍自己那好&#xff0c…

linux操作系统--常用命令篇(网络安全、运维和测试人员必备技能)

前言&#xff1a;linux 命令是对 Linux 系统进行管理的命令。对于 Linux 系统来说&#xff0c;无论是中央处理器、内存、磁盘驱动器、键盘、鼠标&#xff0c;还是用户等都是文件&#xff0c; Linux 系统管理的命令是它正常运行的核心&#xff0c;与之前的 DOS 命令类似。linux …