自定义一个response、在响应头中放数据、函数和方法的区别、开启media访问、页面静态化

【1】自定义一个response

# 类似JsonResponse函数的方法

class JS(HttpResponse):
    def __init__(self,data):
        res = json.dumps(data)
        return super().__init__(res)

【2】在响应头中放数据的方式

  • 1、Httpresponse
    • 方式一:直接传headers参数,header默认是一个空字典
    • 方式二:利用字典传值方式
from django.shortcuts import render,HttpResponse,redirect


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




# 方式二

def index(request):
    res = HttpRespose('ok')
    res['xxx'] = 'xxx'
    return res
  • 2、JsonResponse
    • 直接传headers参数
    • 使用字段传值方式
  • 3、render
    • 只能使用字典传值方式
  • 4、redirect
    • 只能使用字典传值方式

使用字典传值方式是通用的,每个方式都能使用

【3】函数和方法的区别

函数:传值时,有几个参数就要传几个参数

 

函数调用时,不会自动传值


方法:方法传值时,会把自己当成第一个参数传递给方法的第一个参数

 

方法调用时,会自动传值


利用模块查看一个函数是方法还是函数 

                

from  types  import  FunctionType,MethodType

def index():
    pass


使用:
    print(isinstance(add,FunctionType))    #  True
    print(isinstanc(add,MythodType))        # False

【4】开启meida访问

        步骤一

       在项目的根目录下创建一个media文件夹

        步骤二

然后在settings.py文件夹中配置路径

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

        步骤三

配置路由:

         

from django.conf import settings

from django.views.static import serve
from 项目名 import settings



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





'''
from django.conf import settings ----------- django内置的

django有两个配置文件,一个项目自己的,一个是内置的

如果自己配置了,就是用自己配置的,如果没有配置就使用内置的(conf) ----- 内置的


如果使用自己配置的,路径没有找到,就找不到

如果使用内置的,路径找不到就会使用内置的
'''

                

如果在settings.py文件中,配置了static文件夹,会自动开启media,在浏览器中可以直接访问。

因为上述原因,所以在static文件夹下不要存重要内容

        

        配置static:        

        

STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]

media文件及在static文件下面

media上传图片,并在前端页面中显示图片

# from django_demo04 import settings  # django 有两套配置文件--》一套是项目自己的,一套内置的
def upload_img(request):
    myfile = request.FILES.get('myfile')
    print(settings.MEDIA_ROOT)
    # print(settings.MEDIA_URL)
    # 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)
    # 图片上传成功后,想在浏览器中输入:http://127.0.0.1:8000/media/default.png就能访问到
    #1 static文件夹,配置文件写好了,会自动开启
    '''
    1 static文件夹,配置文件写好了,会自动开启
    # static 文件夹,只要配置如下,就会自动开启---》浏览器中可以直接访问到它---》所以在static文件夹下不要重要内容,因为客户端可以直接下载访问
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
    2 我们想让media这个文件夹像static文件夹一样,能被用户浏览器访问---》自己开启路由-->url中写路由
    访问的路径是:http://127.0.0.1:8000/       media/default.png
        -正则方法  re_path  
        re_path('^media/(?P.*)', serve, kwargs={'document_root': settings.MEDIA_ROOT}),
        media/      img/default.png
        访问meida这种路径,django会去 document_root指定的文件夹下找对应的文件
        -转换器   path
        path('media/', serve, kwargs={'document_root': settings.MEDIA_ROOT})
    
    3 以后想开启media的访问
        1 在项目根路径创建media文件
        2 在配置文件中配置
        MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
        3 路由中配置:path('media/', serve, kwargs={'document_root': settings.MEDIA_ROOT})
    '''
    return HttpResponse('图片上传成功')

【5】页面静态化

-只要用户访问---》就会去查
-做成静态化


# 有些页面访问频率很高
from .models import Book
from django.conf import settings
from django.template import Template, Context
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)

你可能感兴趣的:(数据库)