习题补充整理

目录

一、自己封装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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用vue脚手架创建vue项目

Vue是一个流行的前端框架&#xff0c;可以用简洁的语法和组件化的思想开发单页面应用。Vue脚手架是一个官方提供的命令行工具&#xff0c;它可以帮你快速搭建和配置vue项目的基本结构和依赖。 本文介绍如何使用vue脚手架创建一个vue2项目&#xff0c;并选择一些常用的功能和插件…

【JavaFX漏扫开发基础】JavaFx项目基础

文章目录 前言一、创建项目二、运行程序三、application的启动方式和生命周期四、生命周期前言 创建第一个javafx项目,用Idea编辑器来创建。 提示:以下是本篇文章正文内容,下面案例可供参考 一、创建项目 初创项目,第一个javafx的窗口。 依次点击,新建项目 点击Jaca…

字节的“游戏心脏”,真的停止跳动了吗?

字节跳动在游戏行业的宏大叙事&#xff0c;终究变成了一场游戏一场梦。 近日&#xff0c;朝夕光年首次公开回应此前的裁员传闻&#xff0c;明确表示会有业务方向和组织调整&#xff0c;游戏业务将迎来大规模收缩&#xff0c;未来会更加聚焦部分创新型游戏及相关技术的探索。 …

spring RedisTemplate RedisLockRegistry opsForXxx 基本使用总结以及介绍

一、基本介绍 RedisTemplate 为 spring 对 redis 操作的高度封装&#xff0c;基本已经满足所有使用场景。 若存在其他拓展使用我们可以自行封装工具类对基本操作进行组装。 RedisLockRegistry 对 redis 锁的一些封装 二、不同环境下依赖以及基本配置 2.1 spring-boot 下依赖…

MySQL之 InnoDB逻辑存储结构

InnoDB逻辑存储结构 InnoDB将所有数据都存放在表空间中&#xff0c;表空间又由段&#xff08;segment&#xff09;、区&#xff08;extent&#xff09;、页&#xff08;page&#xff09;组成。InnoDB存储引擎的逻辑存储结构大致如下图。下面我们就一个个来看看。 页&#xff08…

WPF实战项目十八(客户端):添加新增、查询、编辑功能

1、ToDoView.xmal添加引用&#xff0c;添加微软的行为类 xmlns:i"http://schemas.microsoft.com/xaml/behaviors" 2、给项目添加行为 <i:Interaction.Triggers><i:EventTrigger EventName"MouseLeftButtonUp"><i:InvokeCommandAction Com…

【漏洞复现】熊海cms 存在sql注入 附poc

漏洞描述 熊海CMS 是由熊海开发的一款可广泛应用于个人博客,个人网站,企业网站的一套网站综合管理系统。 其采用前后端整合设计思路,php,Apache,mysql,前端使用Bootstrap和少许jquery前端框架开发; 网站样式设计简洁大方,整体功能点并不多,但功能正好够用;拥有一个…

【计网 面向连接的传输TCP】 中科大笔记 (十 二)

目录 0 引言1 TCP 的特性1.1 拓展&#xff1a;全双工、单工、半双工通信 2 TCP报文段结构3 TCP如何实现RDT4 TCP 流量控制4.1 题外话&#xff1a;算法感悟 5 TCP连接3次握手、断开连接4次握手5.1 连接5.2 断开连接 6 拥塞控制6.1 拥塞控制原理6.2 TCP拥塞控制 &#x1f64b;‍♂…

Docker容器网络模式

1.none网络 1&#xff09;使用默认网络模式创建一个BusyBox容器&#xff0c;用于对比none网络模式&#xff1b; 测试网络&#xff0c;可以正常连接外网。 2&#xff09;再创建一个none网络模式的BusyBox容器&#xff1b; 测试网络连接&#xff0c;无法连接外网。 总结&#x…

六:Day01_Spring Boot01

一、Spring Boot简介 1. 概念简介 Spring Boot是Spring公司的一个顶级项目&#xff0c;和Spring Framework是一个级别的。 Spring Boot实际上是利用Spring Framework 4 自动配置特性完成。编写项目时不需要编写xml文件。 2. 启动器介绍 Spring Boot的启动器实际上就是一个依赖…

TSINGSEE青犀AI视频智能分析系统的视频接入能力解析

视频智能分析技术是一种先进的人工智能技术&#xff0c;它能够对视频内容进行自动化的分析和理解。这种技术的主要特点包括实时性、自动化、准确性、可解释性等。 1&#xff09;实时性。视频智能分析技术能够在短时间内对大量的视频数据进行快速处理和分析&#xff0c;从而提供…

【网络BSP开发经验】网络流量应用识别技术

文章目录 网络流量应用识别技术背景应用识别基本原理应用识别主流技术方向特征识别技术单报文解析流特征解析 关联识别技术DNS关联识别 行为识别技术 应用识别框架介绍应用特征提取经验tcpdump 抓包方式默认启动监视指定网络接口的数据包监视指定主机的数据包 禁用特征提取加速…

Small Data Transmission (二)具体过程

这篇是SDT相关的具体过程,包括RRC层初始化SDT 的条件,MAC 层初始化SDT过程的判断,CG-SDT的具体过程,TA Validation for CG-SDT, CG-SDT TA 验证的路径损耗参考推导,SDT Uplink Time Alignment,RRC inactive中的CG based PUSCH传输和RA based PUSCH传输,依次看下。 初始…

简历上的工作经历怎么写

通过了简历筛选&#xff0c;后续的面试官会仔细阅读你的简历内容。他们在找什么呢&#xff1f;他们希望搞清楚你在某一段经历中具体干了什么&#xff0c;并且判断你的能力具体达到了什么水平。 简历在线制作下载&#xff1a;百度幻主简历 面试官喜欢具体的经历 越具体&#x…

计算机网络(二)

&#xff08;八&#xff09;客户端软件设计的细节 A、解析协议号 客户端可能会需要通过协议名指定协议&#xff0c;但是Socket接口是用协议号指定的&#xff0c;这时候我们就需要使用getprotobyname()函数实现协议名到协议号的转换&#xff0c;该函数会返回一个指向protoent的…

第三方实验室LIMS管理系统源码,asp.net LIMS源码

LIMS实验室信息管理系统源码 LIMS系统的功能根据实验室的规模和任务而有所不同&#xff0c;其系统主要功能包括:系统维护、基础数据编码管理&#xff0c;样品管理、数据管理、报告管理、报表打印、实验材料管理、设备管理等。它可以取代传统的手工管理模式而给检测实验室带来巨…

基于SSM框架的餐馆点餐系统的设计

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

什么是Anaconda?作用是?使用python必须要安装嘛?

一、什么是Anaconda以及其作用&#xff1f; 通俗来讲&#xff0c;Anaconda算是一个环境容器&#xff0c;也可以叫环境管理器。 作用&#xff1a;可以在Anaconda容器中为python项目创建不同的环境。在各个不同环境中可以安装不同版本的包并且各个环境互不影响。可以在使用不同项…

唯品会年度特卖大会㊙内购清单㊙

唯品会年度特卖大会㊙内购清单㊙ 内部员工亲友专享&#xff0c;实实在在省钱&#xff0c;❌抢完不补! 今晚8点开抢&#xff0c;提前收藏>> https://t.vip.com/Im3KlTnDSJ8 2023年唯品会年度特卖大会热门会场推荐 1.唯品会年度特卖大会 限时加码!瓜分百万津贴!抢海量…

java论坛数据以及搜索接口实现

一. 内容简介 java论坛数据以及搜索接口实现 二. 软件环境 2.1 java 1.8 2.2 mysql Ver 8.0.13 for Win64 on x86_64 (MySQL Community Server - GPL) 2.3 IDEA ULTIMATE 2019.3 2.4d代码地址 三.主要流程 3.1 创建数据库,创建数据表 3.2 开始编写接口&#xff0c;并测…