一、第九天作业
在某页面点击超链接,获取数据库中所有学生的信息, 并显示在另一个页面,在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
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)的权限,每个模型默认有添加、修改、删除
三个权限。
用户与组是“多对多”关系;
用户与权限也是“多对多”关系。