web后端--Django学习笔记10

一、第九天作业

​ 在某页面点击超链接,获取数据库中所有学生的信息, 并显示在另一个页面,在1分钟之内,即使添加新的学生信息,点击超链接仍然显示之前的学生信息,直到1分钟之后,点击超链接才显示最新信息。

1.1 代码演示

1、models

from django.db import models
​
class Student(models.Model):
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    score = models.FloatField()
​
    class Meta:
        db_table = 'students'
​

2、views

from django.shortcuts import render
from django.views.decorators.cache import cache_page
​
from homeworkapp.models import Student
​
​
def go_index(request):
    return render(request,'homeworkapp/index.html')
​
@cache_page(60)  #调用缓存函数
def all_students(request):
    students = Student.objects.all()
    return render(request,'homeworkapp/allstudents.html',locals())

3、templates

<!index.html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <a href="{% url 'home:allstudents' %}">点击查看学生信息</a>
</body>
</html>
<!allstudents.html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>所有学生信息</title>
</head>
<body>
    <table align="center" border="1">
        <thead>
           <tr>
               <th>学号</th>
               <th>姓名</th>
               <th>年龄</th>
               <th>成绩</th>
           </tr>
        </thead>
        <tbody>
           {% for student in students %}
               <tr>
                  <td>{{ student.id }} </td>
                  <td>{{ student.name }} </td>
                  <td>{{ student.age }} </td>
                  <td>{{ student.score }} </td>
               </tr>
           {% endfor %}
        </tbody>
    </table>
</body>
</html>

4、urls

#子路由
from django.urls import path
​
from homeworkapp.views import *
​
app_name = "homeworkapp"
​
urlpatterns = [
    path('goindex',go_index),
    path('students/',all_students,name="allstudents"),
]
#总路由
from django.contrib import admin
from django.urls import path,include
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('homeworkapp/',include('homeworkapp.urls',namespace="home")),

二、AOP与Django中间件

​ AOP:Aspect Oriented Programming,面向切面编程。 切面:独立于业务逻辑的某一方面的功能。 切点:在某个时机执行的代码。

Django中间件使用了AOP的编程思想,将独立的功能组装到中间件。
​
Django实现中间件的步骤:
1.  在某个目录下创建模块,在模块中创建一个继承MiddlewareMixin类的
    中间件类。
2.  在自定义的中间件类中添加相关执行时机的方法。
3.  在settings.py中的MIDDLEWARE对自定义的中间件进行注册。
​
注意1:中间件执行时间的方法:
      process_request(self, request) 
      请求预处理方法,执行时机:接收到请求,但还未解析URL到指定view。
​
      process_view(self, request, view, args, kwargs)
      View预处理方法,执行时机:执行完request预处理函数并确定待执行的view之后,但在view函数实际执行之
      前。
​
      process_response(self, request, response)
      Response后处理方法,执行时机:在Django执行view函数并生成response之后
​
      process_exception(self, request, exception)
      Exception后处理方法:执行时机:request处理过程中出了问题并且view函数抛出了一个未捕获的异常时才会被调用。
​
注意2:中间件的配置顺序特别重要,请求按照中间件的配置顺序执行,响应按照中间件的倒序执行。

2.1 代码演示

1、setting.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'middleware.mymiddleware.MyFirstMiddleware',
    'middleware.mymiddleware.MySecondMiddleware',
]

2、middleware/middleware.py

from django.http import HttpResponse
from django.middleware.common import CommonMiddleware
from django.utils.deprecation import MiddlewareMixin
​
​
​
class MyFirstMiddleware(MiddlewareMixin):
    def process_request(self,request): #请求预处理方法,执行时机:接收到请求,但还未解析URL到指定view
        print("这是MyFirstMiddleware的process_request")
        request_path = request.path
        print("您请求的路径是:",request_path)
        ip = request.META["REMOTE_ADDR"]  #访问IP加黑名单
        print("该请求的发送者是:",ip)
        if ip == "10.12.153.72":
            return HttpResponse("本网站不欢迎你!") #直接返回文本
​
​
    def process_response(self,request,response):
        print("MyFirstMiddleware的process_response")
        print("访谈完了,感觉不错吧?")
        # return response
        return HttpResponse("<h3 style='color:blue'>这不是视图函数给你的响应(First)</h3>")
​
​
class MySecondMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print("这是MySecondMiddleware的process_request")
​
    def process_response(self,request,response):
        print("MySecondMiddleware的process_response")
        # return response
        return HttpResponse("<h3 style='color:blue'>这不是视图函数给你的响应(Second)</h3>")

3、views

扫描二维码关注公众号,回复: 4110912 查看本文章
from django.http import HttpResponse
from django.shortcuts import render
​
​
def hello(request):
    return HttpResponse("<h3 style='color:red'>欢迎学习Middleware中间件</h3>")
​

4、urls

#子路由
from django.urls import path
from middlewareapp.views import *
​
urlpatterns = [
    path('hello/',hello),
]
#总路由
path('middleware/',include('middlewareapp.urls')),

三、富文本编辑

使用django-tinymce插件,实现后台文本的富文本编辑效果
 第一步:使用pip install django-tinymce安装插件
第二步:将Python安装目录中的Lib\site-packages中的tinymce文件夹(应用) 拷贝到项目中。
第三步:在settings.py的INSTALLED_APPS中注册tinymce应用。
第四步:在自己的模型类中添加属于tinymce中的Field,eg:HTMLField().
​
可以修改tinymce应用中的配置文件settings.py,DEFAULT_CONFIG中的
theme的值改为"advanced",还可添加'width'和'height'。

3.1 代码演示

from django.db import models
from tinymce.models import HTMLField
​
​
class Article(models.Model):
    title = models.CharField(max_length=20)
    content = HTMLField()
    publish_date = models.DateField()
​
    class Meta:
        db_table = "articles"
​
#注册管理 admin.py文件
from django.contrib import admin
from richapp.models import *
​
admin.site.register([Article,])
​

四、定时获取后台数据

 1.前台JS使用定时器
​
     setInterval("getUnreadEmails()",1000*10);   // 每隔10秒调用getUnreadEmails()
     
2.使用Ajax局部刷新数据
​
3.后台通过JsonResponse返回数据,发送到前端后自动成为JavaScript对象。

4.1 代码演示

1、models

from django.db import models
​
class Email(models.Model):
    theme = models.CharField(max_length=20,verbose_name="主题")
    content = models.TextField(verbose_name="邮件内容")
    sender = models.CharField(max_length=20,verbose_name="发送人")
    status = models.BooleanField(verbose_name="是否已读")
​
    def __str__(self):
        return self.theme
​
    class Meta:
        db_table = "emails"
        verbose_name_plural = "邮件模型"
​

2、templates/emailapp/emails.html

<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>邮件信息</title>
    <script src="{% static 'js/jquery-3.1.1.js' %}"></script>
    <script type="text/javascript">
        function getUnreadEmails(){
            $.ajax({
                url:'/emailapp/unread/',
                type:'get',
                success:function(data){
                    $("#unread").empty();  // 清空原来的内容
                    var emails = data.info;  // 获取邮件数组
                    for(var key in emails){
                        var email = emails[key]; // 获取每一封邮件
                        var eid=email.eid;
                        var etheme=email.etheme;
                        var econtent=email.econtent;
                        var esender=email.esender;
                        $("#unread").append("邮件编号:"+eid+"<br/>");
                        $("#unread").append("主题:"+etheme+"<br/>");
                        $("#unread").append("内容:"+econtent+"<br/>");
                        $("#unread").append("发件人:"+esender+"<br/>");
                        $("#unread").append("<hr/>");
                    }
​
                },
                dataType:'json',
            })
        }
​
        setInterval("getUnreadEmails()",1000*10);   // 每隔10秒定时调用getUnreadEmails()函数
​
    </script>
</head>
<body>
    <h4>未读邮件:</h4>
    <div id="unread"></div>
</body>
</html>

3、views

from django.http import JsonResponse
from django.shortcuts import render
​
from emailapp.models import Email
​
​
def go_email(request):
    return render(request,'emailapp/emails.html')
​
def get_unread_emails(request):
    print("执行get_unread_emails()...")
    unread_emails = [] # 存储未读邮件的列表
    emails = Email.objects.filter(status=0)  # 查询状态为0的邮件(未读邮件)
    for email in emails:   # 遍历查询出的邮件
        e_id = email.id
        e_theme = email.theme
        e_content = email.content
        e_sender = email.sender
        email = {"eid":e_id,"etheme":e_theme,"econtent":e_content,"esender":e_sender}  # 将每个邮件信息组装到字典中
        unread_emails.append(email)
​
    return JsonResponse({"info":unread_emails})

4、urls

#子路由
from django.urls import path
from emailapp.views import *
​
app_name = "emailapp"
​
urlpatterns = [
    path('goemail/',go_email),
    path('unread/',get_unread_emails,name="unread"),
]
#总路由
 path('emailapp/',include('emailapp.urls',namespace="email"))

五、admin后台权限管理

​ Django的权限系统是通过User(用户)、Group(组)、Permission(权限)完成的。

创建Django超级用户,终端执行
python manage.py createsuperuser
登录Django后台管理
http://localhost:8000/admin   #本地登录
注意:Permission是针对模型(Model)的权限,每个模型默认有添加、修改、删除
      三个权限。
   
用户与组是“多对多”关系;
用户与权限也是“多对多”关系。

猜你喜欢

转载自blog.csdn.net/weixin_42569562/article/details/84110702