Django高级拓展

Django高级拓展

静态文件

1.css、js、图片、json文件、字体文件等

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

2.配置settings.py

{% load static from staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <link rel="stylesheet" type="text/css" href="{% static 'myApp/css/style.css' %}"/>
    <script type="text/javascript" src="/static/myApp/js/jquery-3.1.1.min.js"></script>
    <script type="text/javascript" src="/static/myApp/js/sunck.js"></script>
</head>
<body>
    <h1>sunck is a good man</h1>
    <img src="/static/myApp/img/2.png"/>
    <img src="{% static 'myApp/img/2.png' %}"/>
</body>
</html>

中间件

1.概述:一个轻量级、底层的插件,可以介入Django的请求和响应

2.本质:就是python类

3.方法:

init   init其实就是创建的意思不需要传参数,服务器响应第一个请求的时候自动调用,调用一次,用于确定是否启                用该中间件
process_request(self,request)在执行视图之前被调用(分配url视图之前),每个请求上都会调用,返回None或者                HttpResponse对象
process_view(self,request,view_func,view_args,view_kwargs)   调用视图之前执行,每个请求都会调用,返                 回None或者HttpResponse对象
process_template_response(self,request,response)  在视图刚好执行完后调用,每个请求都会调用,返回None                 或者HttpResponse对象,使用render
process_response(self,request,response) 所有响应返回浏览器之前调用,每个请求都会调用,返回                           HttpResponse对象
process_exception(self,request,exception)  当视图跑出异常时调用,返回HttpResponse对象

自定义中间件

1.在工程目录下middleware目录下创建myApp目录

2.创建一个python文件

from django.utils.deprecation import MiddlewareMixin
class MyMiddle(MiddlewareMixin):
    def process_request(self, request):
        print("get参数为:", request.GET.get("a"))

3使用自定义中间件:配置setting.py文件 ,在MIDDEWARE中添加’middleware.myApp.myMiddle.MyMiddle’

4.注意:使用中间件,可以干扰整个处理过程,每次请求都会执行中间件的这个方法

上传照片

1.概述:文件上传时,文件数据存储在request.FILES属性中,

注意:form表单上要上传文件需要加enctype=”multipart/form-data”

注意:上传文件必须是post请求

2.存储路径:在static目录下创建upfile目录用于存储接收上传文件

配置setting.py文件  MDEIA_ROOT=os.path.join(BASE_DIR,r'static\upfile')

代码示例

<body>
    <form method="post" action="/savefile/" enctype="multipart/form-data">
        {%csrf_token%}
        <input type="file" name="file"/>
        <input type="submit" value="上传"/>
    </form>



def upfile(request):
    return render(request, 'myApp/upfile.html')
import os
from django.conf import settings
def savefile(request):
    if request.method == "POST":
        f = request.FILES["file"]
        # 文件在服务器端的路径
        filePath = os.path.join(settings.MDEIA_ROOT, f.name)
        with open(filePath, 'wb') as fp:
            for info in f.chunks():
                fp.write(info)
        return HttpResponse("上传成功")
    else:
        return HttpResponse("上传失败")

Paginator对象

1,创建对象 格式:Paginator(列表,整数0)

 返回值:返回的分页对象

2.属性:count 对象总数

          num_pages 页面总数

          page_range :页面代码 ,{1,2,3,4,5}  ,页面从1开始

3.方法:page(num) 获得一个Page对象,如果提供的页码不存在会抛出“InvalidPage”异常

4.异常:InvalidPage 当向page()传递的是一个无效的页码时抛出

          PageNotAnlnteger   当向page()传递的不是一个整数时抛出

          EmptyPage    当向page()传递一个有效值,但是该页面没有数据时抛出

Page对象

1.创建对象:Paginator对象的page()方法返回得到Page对象,不需要手动创建

2.属性:object_list 当前页上所有数据(对象)列表

            number   当前页的页码值

            paginator   当前page对象关联的paginator对象

3.方法

Paginator对象与Page对象的关系

url(r'^studentpage/(\d+)/$', views.studentpage),
from .models import Students
from django.core.paginator import Paginator
def studentpage(request, pageid):
    # 所有学生列表
    allList = Students.objects.all()
    paginator = Paginator(allList,6)
    page = paginator.page(pageid)
    return render(request,'myApp/studentpage.html',{"students":page})

代码示例

<body>
    <ul>
        {% for stu in students %}
        <li>
            {{stu.sname}}-{{stu.sgrade}}
        </li>
        {% endfor %}
    </ul>
    <ul>
        {% for index in students.paginator.page_range %}
            {% if index == students.number %}
                <li>
                {{index}}
            </li>
            {% else %}
                <li>
                <a href="/studentpage/{{index}}/">{{index}}</a>
            </li>
            {% endif %}
        {% endfor %}
    </ul>
</body>

ajax

需要动态生成,请求JSONS数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="/static/myApp/js/jquery-3.1.1.min.js"></script>
</head>
<body>
    <h1>学生信息列表</h1>
    <button id="btn">显示学生信息</button>
    <script type="text/javascript" src="/static/myApp/js/sunck.js"></script>
</body>
</html>

浮动主题

$(document).ready(function (){
    document.getElementById("btn").onclick = function(){
        $.ajax({
            type:"get",
            url:"/studentsinfo/",
            dataType:"json",
            success:function(data, status){
                console.log(data)
                var d = data["data"]

                for(var i = 0; i < d.length;i++){
                    document.write('<p>'+d[i][0]+'</p>')
                }

            }
        })
    }
})

def ajaxstudents(request):
    return render(request, 'myApp/ajaxstudents.html')
from django.http import JsonResponse
def studentsinfo(request):
    stus = Students.objects.all()
    list = []
    for stu in stus:
        list.append([stu.sname, stu.sage])
    return JsonResponse({"data":list})

富文本

1.pip install django-tinymce

2.在站点中使用:配置setting.py INSTALLED_APPS添加

子主题

TINYMCE_DEFAULT_CONFIG = {
    'theme':'advanced',
    'width':600,
    'height':400,
}

创建一个类模型

from tinymce.models import HTMLField
class Text(models.Model):
    str = HTMLField()

配置站点

from .models import Text
admin.site.register(Text)

在自定义视图中使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>富文本</title>
    <script type="text/javascript" src="/static/tiny_mce/tiny_mce.js"></script>
    <script type="text/javascript">
        tinyMCE.init({
            'mode':'textareas',
            'theme':'advanced',
            'width':800,
            'height':600,
        })
    </script>
</head>
<body>
    <form action="/saveedit/" method="post">
        <textarea name="str">sunck is a good man</textarea>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

celery

1.http://docs.jinkan.org/docs/celery/

2.问题:用户发起request,并且要等待response返回。但是在视图中有一些耗时的操作,导致用户可能会等待很 长时间才能接受response,这样用户体验很差

,网站每隔一段时间要同步一次数据,但是http请求是需要触发的

3.解决:用celery来解决:将耗时的操作放到celery中执行

4.celery :用的redis数据库

        1.任务task:本质是一个python函数,将耗时操作封装成一个函数

        2.队列quene :将要执行的任务放到队列里

       3.工人worker :负责执行中的任务

       4.代理broker:负责调度,在部署环境中使用redis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值