习题补充整理

news2024/11/15 21:23:27

目录

一、自己封装response

二、在响应头中放数据

HttpResponse

redirect

​编辑 

render

JsonResponse

三、函数和方法区别 ----》绑定方法区别

四、上传图片和开启media访问

五、页面静态化(解决访问率高的问题)


一、自己封装response

  • 第一步,在app01下新建一个py文件 ----> response.py
  • 想要传一个字典(({'name':"kevin"})),类加括号必然会触发__init__,由于只有一个参数self,需要用data接受另外一个参数
from django.shortcuts import HttpResponse


import json


class MyResponse(HttpResponse):
    def __init__(self, data):
        res = json.dumps(data, ensure_ascii=False) # 进行序列化

        return super().__init__(res) # 将res传进来
  • 第二步,写视图函数
from django.shortcuts import render

# Create your views here.

from .response import MyResponse  # 相对导入


def index(request):
    return MyResponse({'code': 100, 'msg': '请求成功'})
  • 第三步,配置路由
from django.contrib import admin
from django.urls import path

from app01.views import index

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),  # 访问根路径
]
  • 第四步,启动,结果如下

 

  •  若data传入是字符串('请求成功'),则依然可以

  • 可做一个小限制,在第一层判断是不是字典或列表,才能序列化
class MyResponse(HttpResponse):
    def __init__(self, data):
        if isinstance(data, dict) or isinstance(data, list):
            res = json.dumps(data, ensure_ascii=False)  # 进行序列化

            return super().__init__(res) # 将res传入

二、在响应头中放数据

HttpResponse

  • 方式一
def index(request):
    return HttpResponse('ok', headers={'xxx': 'xxx'})

 

  • 方式二
def index(request):
    # return HttpResponse('ok', headers={'xxx': 'xxx'})
    obj = HttpResponse('ok')
    obj['yyy'] = 'yyy'  # 像字典一样放入,最终会放在http的响应头中
    return obj

 

redirect

  • 重定向第三方的网站
return redirect('http://www.baidu.com')
  • 重定向自己的网站(login)
    • 视图函数
from django.shortcuts import render,redirect,HttpResponse,resolve_url

from django.http import JsonResponse
# Create your views here.

from .response import MyResponse



def index(request):

    # return redirect('http://www.baidu.com')
    # res = resolve_url('login')  # 反向解析,通过名字拿到真正的字符串的地址
    # return redirect('/login', headers={'xxx': 'ssss'})  # 不生效
    obj = redirect('/login')
    obj['xxx'] = 'xxx'
    return obj



def login(request):
    return HttpResponse('login')
  • 路由
from django.contrib import admin
from django.urls import path

from app01.views import index, login

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),  # 访问根路径
    path('login/', login, name='login'), # 访问login
]

 

render

    # return render(request,'index.html',headers={'xxx': 'ssss'}) # 不行
    obj = render(request, 'index.html')
    obj['xxx'] = 'xxx'
    return obj

 

JsonResponse

  • 方式一
return JsonResponse({'name': 'lqz'}, headers={'xxx': 'ssss'})

 

  • 方式二
    obj = JsonResponse({'name': 'lqz'})
    obj['yyy'] = 'yyy'
    return obj

 

三、函数和方法区别 ----》绑定方法区别

  • 绑定给对象的方法 ---》对象来调用 ----> 类来调用
    • 类来调用对象的绑定方法  ----》这个方法就变成了普通函数,有几个值就要传几个值
    • 正常需要传这个类的对象  ----》因为可能方法内部使用了对象
    • 但是如果内部没有使用对象  ----》可以随意传个对象
class Person:

    # 对象绑定方法 ---》写在类中,没有任何装饰器
    def run(self):
        # print(self.name)
        print('人走路')


### 对象绑定方法 ###
# p = Person()
# p.run()
Person.run(1)
Person.run(Person())
  • 绑定给类的方法 ---》类来调用 ----> 对象来调用
### 绑定给类的方法 ###
# Person.xx()  # 正统 类来调用
# Person().xx()
p = Person()
p.xx() # 对象来调用,类的绑定方法,会自动把当前对象的类拿到,传入进去
  • 静态方法
class Person:

    # 对象绑定方法---》写在类中,没有任何装饰器
    def run(self):
        # print(self.name)
        print('人走路')

    @classmethod
    def xx(cls):
        # 把类传入了,类可以实例化得到对象
        p = cls()  # 直接类实例化得到对象,要不要传参数,取决于Person类有没有写__init__
        print(p)
        print('类的绑定方法,xxx')

    # 静态方法 --->本质就是个函数
    @staticmethod
    def yy():
        print('staticmethod')
Person.yy()  # 类来调用
Person().yy() # 对象来调用

总结: 函数和方法

  • 方法有特殊性,绑定给谁,就需要谁来调用,调用时会自动传值
    • 只能能自动传值,它就是个方法
  • 函数,有几个值就要传几个值,不能多也不能少

查看一个 '函数' 到底是函数还是方法

from types import FunctionType, MethodType
def add():
    pass

print(isinstance(add,FunctionType)) # True
print(isinstance(add,MethodType)) # Fals


print(isinstance(Person.xx,FunctionType)) # False  # 类来调用是个方法
print(isinstance(Person.xx,MethodType)) # True

print(isinstance(Person().xx,FunctionType)) # False  # 类来调用是个方法
print(isinstance(Person().xx,MethodType)) # True


print(isinstance(Person.yy,FunctionType)) # True  静态方法,自动传值了吗? 没有,就是函数
print(isinstance(Person.yy,MethodType)) # False


print(isinstance(Person().run,FunctionType)) # false
print(isinstance(Person().run,MethodType)) # True

print(isinstance(Person.run,FunctionType)) # True 不能自动传值---》就是函数
print(isinstance(Person.run,MethodType)) # False

四、上传图片和开启media访问

  • views.py
from django.shortcuts import render, redirect, HttpResponse
from django.conf import settings

def index(request):
    obj = render(request, 'index.html')
    obj['xxx'] = 'xxx'
    return obj

def login(request):
    return HttpResponse('login')


# from django_demo04 import settings
# django 有两套配置文件--》一套是项目自己的,一套内置的
def upload_img(request):
    myfile = request.FILES.get('myfile')
    print(settings.MEDIA_ROOT)
    # with open(settings.MEDIA_ROOT + '/%s' % myfile.name, 'wb') as f:
    with open('media/%s' % myfile.name, 'wb') as f:
        for line in myfile:
            f.write(line)
    return HttpResponse('图片上传成功')
  • urls.py
from django.contrib import admin
from django.urls import path

from app01.views import upload_img

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),  # 访问根路径
    path('login/', login, name='login'),
    path('uplowd_img', upload_img),
]
  • settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

启动之后发现没有开启这个路径 

 

1  static文件夹,配置文件写好了,会自动开启

  • static文件夹,只要配置如下,就会自动开启
  • 浏览器中可以直接访问到它

所以在static文件夹下不要放重要内容,因为客户端可以直接下载访问!

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

2   我们想让media这个文件夹像static文件夹一样,能被用户浏览器访问

  • 自己开启路由
    • url中写路由

访问的路径是:http://127.0.0.1:8000/       media/default.png

  • media/img/default.png
    • 访问meida这种路径,django会去 document_root指定的文件夹下找对应的文件

正则方法  re_path  

re_path('^media/(?P<path>.*)', serve, kwargs={'document_root': settings.MEDIA_ROOT}),

转换器   path

path('media/<path:path>', serve, kwargs={'document_root': settings.MEDIA_ROOT})

from django.contrib import admin
from django.urls import path, re_path

from app01.views import upload_img, index, login

from django.views.static import serve
from django.conf import settings
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),  # 访问根路径
    path('login/', login, name='login'),
    path('uplowd_img', upload_img),
    path('media/<path:path>', serve, kwargs={'document_root': settings.MEDIA_ROOT})
]

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>看帅哥</h1>
<img src="http://127.0.0.1:8000/media/img/default.png" alt="">
</body>
</html>

总结:

以后想开启media的访问

1 在项目根路径创建media文件

2 在配置文件中配置

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

3 路由中配置:

path('media/<path:path>', serve, kwargs={'document_root': settings.MEDIA_ROOT}) 

结果如下

 

  

五、页面静态化(解决访问率高的问题)

models.py

from django.db import models

# Create your models here.
class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.IntegerField()
    publish = models.CharField(max_length=64)

views.py 

from .models import Book


from django.conf import settings

from django.template import Template, Context

import os
def books_view(request):
    # 做静态化
    if os.path.exists(os.path.join(settings.BASE_DIR, 'cache', 'books.html')):
        print('不走数据库')
        with open('cache/books.html', 'rt', encoding='utf-8') as f:
            res_str = f.read()
        return HttpResponse(res_str)
    else:
        books = Book.objects.all()
        with open('templates/books.html', 'rt', encoding='utf-8') as f:
            res = f.read()
        t = Template(res)
        c = Context({'books': books})
        html = t.render(c)
        # 保存起来
        with open('cache/books.html', 'wt', encoding='utf-8') as f:
            f.write(html)
        return HttpResponse(html)

urls.py

from app01.views import upload_img, index, login,books_view
from django.views.static import serve
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),
    path('books/', books_view),

books.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
    <div class="row">

        <div class="col-md-8 col-md-offset-2">


            <table class="table table-striped">
                <thead>
                <tr>
                    <th>id号</th>
                    <th>图书名</th>
                    <th>图书价格</th>
                    <th>出版社</th>
                </tr>
                </thead>
                <tbody>

                {% for book in books %}
                    <tr>
                        <th scope="row">{{ book.id }}</th>
                        <td>{{ book.name }}</td>
                        <td>{{ book.price }}</td>
                        <td>{{ book.publish }}</td>
                    </tr>
                {% endfor %}


                </tbody>
            </table>
        </div>
    </div>
</div>
</body>
</html>

插入一些数据

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django01.settings')
import django
django.setup()
import random
from app01.models import Book
for i in range(100):
    Book.objects.create(name='图书_%s'%i,price=random.randint(1,100),publish='%s出版社'%i)

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

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

相关文章

【注册表】Sublime Text添加到右键菜单

官网下载 windows下地地址: http://www.sublimetext.com/download_thanks?targetwin-x64设置右键菜单和菜单小图标 win R打开运行&#xff0c;并输入regedit打开注册表编辑器依次找到HKEY_CLASSESS_ROOT -> * -> Shell&#xff0c;下面新建项&#xff0c; 这个项的名…

制作rpm安装包时如何处理升级

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 升级命令执行顺序重要参数版本问题注意事项 升级命令 rpm安装包的升级…

web前端tips:js继承——寄生组合式继承

上篇文章给大家分享了 js继承中的 寄生式继承 web前端tips&#xff1a;js继承——寄生式继承 今天给大家分享一下 js 继承中的 寄生组合式继承 寄生组合式继承 寄生组合式继承是一种结合了寄生式继承和组合式继承的方式&#xff0c;它的目标是减少组合式继承中多余的调用父…

力扣295. 数据流的中位数(java,堆解法)

Problem: 295. 数据流的中位数 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 由于该题目的数据是动态的我们可以维护两个堆来解决该问题 1.维护一个大顶堆&#xff0c;一个小顶堆 2.每个堆中元素个数接近n/2&#xff1b;如果n是偶数&#xff0c;两个堆中的数据个数…

最简单的链路追踪收集器

链路追踪可帮助您快速了解程序服务之间的调用关系&#xff0c;并快速洞悉内部发生的情况。主流的链路追踪系统有zipkin,jaeger,skywalking等&#xff0c;由于opentelemetry的存在&#xff0c;都具有opentelemetry的转换器。 我们利用opentelemetry来进行zipkin,jaeger,skywalk…

在编程中遇到的问题总结

IDEA空包粘黏问题 创建好目录以后会发现idea自动将空包合并在一起了&#xff0c;而且点击设置里面也没有Compact Middle Package Compact Middle Package如果不在设置的主面板上&#xff0c;则点击Tree Appearance&#xff0c;会发现Compact Middle Package在Tree Appearance里…

git-5

1.GitHub为什么会火&#xff1f; 2.GitHub都有哪些核心功能&#xff1f; 3.怎么快速淘到感兴趣的开源项目 github上面开源项目非常多&#xff0c;为了我们高效率的找到我们想要的资源 根据时间 不进行登录&#xff0c;是没有办法享受到高级搜索中的代码功能的&#xff0c;登录…

Glove学习笔记

global vectors for word representation B站学习视频 1、LSA与word2vec 我们用我们的见解&#xff0c;构建一个新的模型&#xff0c;Glove&#xff0c;全局向量的词表示&#xff0c;因为这个模型捕捉到全局预料的统计信息。 LSA:全局矩阵分解word2vec&#xff1a;局部上下文…

基于Linux下搭建NextCloud构建自己的私有网盘

NextCloud是什么 Nextcloud是一款开源免费的私有云存储网盘项目&#xff0c;可以让你快速便捷地搭建一套属于自己或团队的云同步网盘&#xff0c;从而实现跨平台跨设备文件同步、共享、版本控制、团队协作等功能。它的客户端覆盖了Windows、Mac、Android、iOS、Linux 等各种平…

《opencv实用探索·五》opencv小白也能看懂的图像腐蚀

1、图像腐蚀原理简单理解&#xff1a; 腐蚀是形态学最基本的操作&#xff0c;都是针对白色部分&#xff08;高亮部分&#xff09;而言的。即原图像中高亮部分被蚕食&#xff0c;得到比原图更小的区域。 2、图像腐蚀的作用&#xff1a; &#xff08;1&#xff09;去掉毛刺&…

在idea中写sql语句,向数据库添加数据时,添加的字符串却显示???,解决方法

这是字符编码的问题 如何解决&#xff1a; 在idea的配置数据库的地方修改下边&#xff1a;mysql8版本和5版本差距不大。 在URL后加?useUnicodetrue&characterEncodingUTF8 例如 原来&#xff1a;String url “jdbc:mysql://localhost:3306/stu”; 改变后&#xff1a;St…

Android的启动模式

Android的四种启动模式&#xff1a;standard、singleTop、singleTask和singleInstance。 1.standard Android默认的启动模式是standard&#xff0c;每启动一个Activity&#xff0c;它都会在返回栈中入栈&#xff0c;并处于栈顶&#xff0c;不管这个返回栈是否存在这个activit…

软件工程--需求工程--学习笔记(超详细)

软件需求工程是软件开发周期的第一个阶段&#xff0c;也是关系到软件开发成败最关键阶段&#xff0c;本章讲解需求的基础知识和需求工程的关键活动。这些知识对于结构化方法、面向对象方法、面向服务方法等都是适用的 本文参考教材&#xff1a;沈备军老师的《软件工程原理》 目…

JenKins快速安装与使用,Gitlab自动触发Jenkins

一、JenKins 0.准备&#xff0c;配置好环境 1&#xff09;Git&#xff08;yum安装&#xff09; 2&#xff09;JDK&#xff08;自行下载&#xff09; 3&#xff09;Jenkins&#xff08;自行下载&#xff09; 1.下载安装包 进官网&#xff0c;点Download下方即可下载。要下…

ROS2+STM32小车红外对射光电计数器模块资料

数据&#xff1a;一个周长内有20个孔洞或者20个分隔。外径&#xff1a;6.8cm 图片不是实物图&#xff0c;是示意图 因为没有串口&#xff0c;所以不可能会发送出数字的&#xff0c;就是通过电压变化次数来计算距离或者其他数据 有遮挡时&#xff0c;输出高电平&#xff0c;无遮…

Java实现堆

堆是一种基于完全二叉树的数据结构&#xff0c;它分为大根堆和小根堆。在大根堆中&#xff0c;每个节点的值都大于或等于其子节点的值&#xff1b;而在小根堆中&#xff0c;每个节点的值都小于或等于其子节点的值。 在Java中&#xff0c;我们可以使用数组来表示堆。由于完全二…

AIGC(生成式AI)试用 14 -- 画画

AIGC&#xff0c;内容生成&#xff0c;多多少少都可以达成&#xff0c;好与坏就看你如何引导、如何生成。 画画&#xff1f;本不想让写文本的去生成图片&#xff0c;但忍不住诱惑&#xff0c;小试一把&#xff0c;毕竟文档也是会要个插图的。 CSDN创作助手显然为文字生成而…

【PPT模板合集】关于自制内容的PPT模板合集,包括原创的PPT及改良内容的PPT,适合科研/比赛/工作

【PPT模板合集】关于自制内容的PPT模板合集&#xff0c;包括原创的PPT及改良内容的PPT&#xff0c;适合科研/比赛/工作 零、前言一、校园层面的PPT模板1.1 各种毕业答辩1.2 夏令营答辩1.3 奖学金答辩1.4 比赛/项目答辩 二、学术层面的PPT模板2.1 学术汇报2.2 会议海报类型 三、…

“学习Python能用来做什么?”

文章目录 前言01 Web开发为什么需要Web框架应该使用哪种Python Web框架Django和Flask有什么区别如何选择 02 数据科学机器学习是什么将Python用于机器学习数据分析和数据可视化使用Python进行数据分析/可视化如何用Python学习数据分析/可视化 03 脚本什么是脚本&#xff1f; 04…

STM32---时钟树

写在前面&#xff1a;一个 MCU 越复杂&#xff0c;时钟系统也会相应地变得复杂&#xff0c;如 STM32F1 的时钟系统比较复杂&#xff0c;不像简单的 51 单片机一个系统时钟就 可以解决一切。对于 STM32F1 系列的芯片&#xff0c;其有多个时钟源&#xff0c;构成了一个庞大的是时…