十七、首页和全局404、500页面配置

1、首页配置

  首页页面轮播课程需要在课程的model中添加is_banner字段,说明是否是轮播课程:

 1 class Course(models.Model):
 2     """课程"""
 3     DEGREE_CHOICES = (
 4         ('cj', '初级'),
 5         ('zj', '中级'),
 6         ('gj', '高级')
 7     )
 8
 9     name = models.CharField('课程名', max_length=50)
10     desc = models.CharField('课程描述', max_length=300)
11     detail = models.TextField('课程详情')
12     degree = models.CharField('课程难度', choices=DEGREE_CHOICES, max_length=2)
13     learn_times = models.IntegerField('学习时长(分钟数)', default=0)
14     students = models.IntegerField('学习人数', default=0)
15     fav_nums = models.IntegerField('收藏人数', default=0)
16     click_nums = models.IntegerField('点击数', default=0)
17     image = models.ImageField('封面图', upload_to='courses/%Y/%m', max_length=100)
18     course_org = models.ForeignKey(CourseOrg, verbose_name='所属机构', on_delete=models.CASCADE, null=True, blank=True)
19     category = models.CharField('课程类别', max_length=20, default='')
20     tag = models.CharField('标签', max_length=10, default='')
21     teacher = models.ForeignKey(Teacher, verbose_name='机构讲师', on_delete=models.CASCADE, null=True, blank=True)
22     courseneed_know = models.CharField('课程须知', max_length=300, default='')
23     teacher_tellyou = models.CharField('老师告诉你', max_length=300, default='')
24     is_banner = models.BooleanField('是否轮播', default=False)
25     add_time = models.DateTimeField('添加时间', default=datetime.now)
26
27     class Meta:
28         verbose_name = '课程'
29         verbose_name_plural = verbose_name
30
31     # 获取章节数
32     def get_zj_nums(self):
33         return self.lesson_set.all().count()
34
35     # 获取学习用户
36     def get_learn_users(self):
37         return self.usercourse_set.all()[:5]
38
39     # 获取章节
40     def get_course_lesson(self):
41         return self.lesson_set.all()
42
43     def __str__(self):
44         return self.name

  机构显示需要机构标签,在机构的model中添加tag字段:

 1 class CourseOrg(models.Model):
 2     """课程机构"""
 3     CATEGORY_CHOICES = (
 4         ('pxjg', '培训机构'),
 5         ('gx', '高校'),
 6         ('gr', '个人')
 7     )
 8     name = models.CharField('机构名称', max_length=50)
 9     category = models.CharField('机构类别', max_length=20, choices=CATEGORY_CHOICES, default='pxjg')
10     desc = models.TextField('机构描述')
11     students = models.IntegerField('学习人数', default=0)
12     course_nums = models.IntegerField('课程数', default=0)
13     click_nums = models.IntegerField('点击数', default=0)
14     fav_nums = models.IntegerField('收藏数', default=0)
15     image = models.ImageField('封面图', upload_to='org/%Y/%m', max_length=100)
16     address = models.CharField('地址', max_length=150)
17     city = models.ForeignKey(CityDict, verbose_name='所在城市', on_delete=models.CASCADE)
18     tag = models.CharField('机构标签', max_length=10, default='全国知名')
19     add_time = models.DateTimeField('添加时间', default=datetime.now)
20
21     class Meta:
22         verbose_name = '课程机构'
23         verbose_name_plural = verbose_name
24
25     # 获取教师数量
26     def get_teacher_nums(self):
27         return self.teacher_set.all().count()
28
29     def __str__(self):
30         return self.name

  迁移数据库。

  首页的数据都是需要从后台获取的,先编写首页的接口:

 1 class IndexView(View):
 2     """首页"""
 3     def get(self, request):
 4         # 轮播图
 5         all_banners = Banner.objects.all().order_by('index')
 6
 7         # 课程
 8         courses = Course.objects.filter(is_banner=False)[:6]
 9         # 轮播课程
10         banner_courses = Course.objects.filter(is_banner=True)[:3]
11
12         # 机构
13         orgs = CourseOrg.objects.all()[:15]
14         return render(request, 'index.html', {
15             'all_banners': all_banners,
16             'courses': courses,
17             'banner_courses': banner_courses,
18             'orgs': orgs
19         })

  然后修改首页的url:

1 urlpatterns = [
2     path('', IndexView.as_view(), name='index'),  # 首页
3 ]

  修改前端首页页面中显示数据的代码:

  1 {% extends 'base.html' %}
  2
  3 {% load staticfiles %}
  4
  5 {% block title %}
  6     知能网 - 首页
  7 {% endblock %}
  8
  9 {% block content %}
 10     <div class="banner">
 11             <div class="wp">
 12                 <div class="fl">
 13                     <div class="imgslide">
 14                         <ul class="imgs">
 15 {#                        遍历显示轮播图#}
 16                             {% for banner in all_banners %}
 17                                 <li>
 18                                     <a href="{{ banner.url }}">
 19                                         <img width="1200" height="478" src="{{ MEDIA_URL }}{{ banner.image }}" />
 20                                     </a>
 21                                 </li>
 22                             {% endfor %}
 23                         </ul>
 24                     </div>
 25                     <div class="unslider-arrow prev"></div>
 26                     <div class="unslider-arrow next"></div>
 27                 </div>
 28
 29                 </div>
 30
 31
 32             </div>
 33 <!--banner end-->
 34 <!--feature start-->
 35     <section>
 36         <div class="wp">
 37             <ul class="feature">
 38                 <li class="feature1">
 39                     <img class="pic" src="/static/images/feature1.png"/>
 40                     <p class="center">专业权威</p>
 41                 </li>
 42                 <li class="feature2">
 43                     <img class="pic" src="/static/images/feature2.png"/>
 44                     <p class="center">课程最新</p>
 45                 </li>
 46                 <li class="feature3">
 47                     <img class="pic" src="/static/images/feature3.png"/>
 48                     <p class="center">名师授课</p>
 49                 </li>
 50                 <li class="feature4">
 51                     <img class="pic" src="/static/images/feature4.png"/>
 52                     <p class="center">数据真实</p>
 53                 </li>
 54             </ul>
 55         </div>
 56     </section>
 57 <!--feature end-->
 58 <!--module1 start-->
 59     <section>
 60         <div class="module">
 61             <div class="wp">
 62                 <h1>公开课程</h1>
 63                 <div class="module1 eachmod">
 64                     <div class="module1_1 left">
 65                         <img width="228" height="614" src="/static/images/module1_1.jpg"/>
 66                         <p class="fisrt_word">名师授课<br/>专业权威</p>
 67                         <a class="more" href="{% url 'course:course_list' %}">查看更多课程 ></a>
 68                     </div>
 69                     <div class="right group_list">
 70                         <div class="module1_2 box">
 71                             <div class="imgslide2">
 72                                 <ul class="imgs">
 73 {#                                遍历显示轮播课程#}
 74                                     {% for banner_course in banner_courses %}
 75                                         <li>
 76                                         <a href="{% url 'course:course_detail' banner_course.id %}">
 77                                             <img width="470" height="300" src="{{ MEDIA_URL }}{{ banner_course.image }}" />
 78                                         </a>
 79                                     </li>
 80                                     {% endfor %}
 81                                 </ul>
 82                             </div>
 83                             <div class="unslider-arrow2 prev"></div>
 84                             <div class="unslider-arrow2 next"></div>
 85                         </div>
 86 {#                        遍历显示课程#}
 87                             {% for course in courses %}
 88                                 <div class="module1_{{ forloop.counter|add:2 }} box">
 89                                 <a href="{% url 'course:course_detail' course.id %}">
 90                                     <img width="233" height="190" src="{{ MEDIA_URL }}{{ course.image }}"/>
 91                                 </a>
 92                                 <div class="des">
 93                                     <a href="{% url 'course:course_detail' course.id %}">
 94                                         <h2 title="{{ course.name }}">{{ course.name }}</h2>
 95                                     </a>
 96                                     <span class="fl">难度:<i class="key">{{ course.get_degree_display }}</i></span>
 97                                     <span class="fr">学习人数:{{ course.students }}</span>
 98                                 </div>
 99                                 <div class="bottom">
100                                     <span class="fl" title="慕课网">{{ course.course_org.name }}</span>
101                                     <span class="star fr">{{ course.fav_nums }}</span>
102                                 </div>
103                             </div>
104                             {% endfor %}
105                     </div>
106                 </div>
107             </div>
108         </div>
109     </section>
110     <section>
111         <div class="module greybg">
112             <div class="wp">
113                 <h1>课程机构</h1>
114                 <div class="module3 eachmod">
115                     <div class="module3_1 left">
116                         <img width="228" height="463" src="/static/images/module3_1.jpg"/>
117                         <p class="fisrt_word">名校来袭<br/>权威认证</p>
118                         <a class="more" href="{% url 'org:org_list' %}">查看更多机构 ></a>
119                     </div>
120                     <div class="right">
121                         <ul>
122 {#                        遍历显示机构#}
123                             {% for org in orgs %}
124                                 <li class="{% if forloop.counter|divisibleby:5 %}five{% endif %}">
125                                     <a href="{% url 'org:org_home' org.id %}">
126                                         <div class="company">
127                                             <img width="184" height="100" src="{{ MEDIA_URL }}{{ org.image }}"/>
128                                             <div class="score">
129                                                 <div class="circle">
130                                                     <h2>{{ org.tag }}</h2>
131                                                 </div>
132                                             </div>
133                                         </div>
134                                         <p><span class="key" title="{{ org.name }}">{{ org.name }}</span></p>
135                                     </a>
136                                 </li>
137                             {% endfor %}
138                         </ul>
139                     </div>
140                 </div>
141             </div>
142         </div>
143     </section>
144 {% endblock %}
145
146 {% block custom_js %}
147     <script type="text/javascript" src="/static/js/index.js"></script>
148 {% endblock %}

index.html

  我们在登出然后登陆之后发现轮播图的数据不见了,需要修改登录接口中render首页的代码:

 1 class LoginView(View):
 2     """登录"""
 3     def get(self, request):
 4         return render(request, 'login.html')
 5
 6     def post(self, request):
 7         # form实例化
 8         login_form = LoginForm(request.POST)
 9         if login_form.is_valid():
10             # form验证通过,获取用户提交的用户名和密码
11             user_name = request.POST.get('username', None)
12             pass_word = request.POST.get('password', None)
13
14             # 通过django的authenticate方法获取user对象,也就是验证用户是否存在
15             user = authenticate(username=user_name, password=pass_word)
16
17             if user is not None:
18                 if user.is_active:
19                     # 只有激活用户才能登录
20                     # 验证通过,通过django的login方法去登录,然后返回首页
21                     login(request, user)
22                     return HttpResponseRedirect(reverse('index'))
23                 else:
24                     # 验证不通过,返回登录页面,并将错误信息返回去显示
25                     return render(request, 'login.html', {'msg': '用户名或密码错误', 'login_form': login_form})
26             else:
27                 # 验证不通过,返回登录页面,并将错误信息返回去显示
28                 return render(request, 'login.html', {'msg': '用户名或密码错误', 'login_form': login_form})
29         else:
30             return render(request, 'login.html', {'login_form': login_form})

2、404、500页面配置

  404、500页面,必须在setting.py中设置DEBUG = False:

1 DEBUG = False
2
3 ALLOWED_HOSTS = ['*']
4
5 # 静态文件
6 STATIC_URL = '/static/'
7 STATIC_ROOT = os.path.join(BASE_DIR, 'static')

  在设置DEBUG = False后,django就不会代管你的静态文件,所以要在urls.py文件中设置url处理静态文件的url:

1 urlpatterns = [
2     re_path(r'^static/(?P<path>.*)', serve, {"document_root": STATIC_ROOT}),  # 静态文件显示
3 ]

  然后将404、500页面的html文件放到templates下即可配置完成。

十八、常见的web攻击与防护

1、sql注入攻击与防护

1.1 sql注入攻击的危害

  • 非法读取,篡改,删除数据库中的数据
  • 通过修改数据库来修改网页上的内容
  • 盗取用户的各类敏感信息
  • 注入木马等

1.2 SQL注入攻击原理

  比如下面一段代码:

 1 class LoginUnsafeView(View):
 2     def get(self, request):
 3         return render(request, "login.html", {})
 4     def post(self, request):
 5         user_name = request.POST.get("username", "")
 6         pass_word = request.POST.get("password", "")
 7
 8         import MySQLdb
 9         conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='root', db='mxonline', charset='utf8')
10         cursor = conn.cursor()
11         sql_select = "select * from users_userprofile where email='{0}' and password='{1}'".format(user_name, pass_word)
12
13         result = cursor.execute(sql_select)
14         for row in cursor.fetchall():
15             # 查询到用户
16             pass
17         print 'test'

  用户在登录的时候用户名如果输入 ' OR 1=1, 密码随便输入,SQL语句就变成了这样:

  select * from users_userprofile where email='' OR 1=1' and password='123',email='' or 1=1这条件就直接为True了,不用去执行后面的and语句了,那么是不是直接就将用户的信息拿到了呢,所以这种写法是非常危险的。

  那么如何去防护呢?可以尽量不去使用SQL原生语句去获取数据,可以通过django的orm去查询数据,在登录的使用使用django的login函数,这个函数是安全的。

2、xss攻击与防护

2.1 xss跨站脚本攻击的危害

  • 控制受害者机器向其他网站发起攻击,注入木马
  • 盗取各类用户账号
  • 非法转账等

2.2 xss攻击原理

  黑客将一段带有js代码的url发送给用户,用户点击这个url后发送请求到服务器,服务器返回数据给受害者,然后浏览器执行这段js脚本将用户的cookie信息发送给黑客,然后黑客拿着用户的cookie伪装成用户向服务器发送请求,这时黑客就可以进行任何攻击或者其他操作。

2.3 xss防护

  • 对用户输入的地方和变量都检查长度和对<>;'等字符做一些过滤
  • 不要在cookie中泄露用户的隐私数据,如用户名和密码
  • 将cookie和系统ip绑定来降低cookie泄露后的危险
  • 尽量采用POST方法而非GET提交表单

3、csrf攻击与防护

2.1 csrf攻击的危害

  • 以用户的名义去发送邮件
  • 盗取账号
  • 购买商品
  • 虚拟货币转账

2.2 csrf攻击的原理

  用户登录受信任的A服务器,服务器返回cookie,用户之后的每次请求都会带上cookie去访问A服务器,但是用户在同时的时候没有登出或者关闭A服务器的页面,直接去访问危险的B服务器,然后B服务器要求用户去访问A的一个url,这时信息就会泄露。

2.3 csrf攻击的防护

  在每个form中加上{{ csrf_token }}即可

转载于:https://www.cnblogs.com/Sweltering/p/10004640.html

(项目)在线教育平台(十二)相关推荐

  1. 数仓项目——在线教育平台离线数据仓库效果展示

    背景:基于阿里云的3台ECS云服务器搭建了在线教育平台的离线数据仓库,本文仅用于记录最终的效果,从0到1的实现过程后续进行补充,由于抢占式实例的云服务器按量进行每小时计费,为了避免持续的收费,所以我急 ...

  2. Django+xadmin打造在线教育平台(十)

    目录 在线教育平台(一)      在线教育平台(二) 在线教育平台(三)      在线教育平台(四) 在线教育平台(五)      在线教育平台(六) 在线教育平台(七)      在线教育平台( ...

  3. 基于SpringBoot+Vue前后端分离的在线教育平台项目

    基于SpringBoot+Vue前后端分离的在线教育平台项目 赠给有缘人,希望能帮助到你!也请不要吝惜你的大拇指,你的Star.点赞将是对我最大的鼓励与支持! 开源传送门: 后台:Gitee | Gi ...

  4. 在线教育平台项目——需求分析

    Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. 有一段时间没好好写文章了,可不 ...

  5. 【项目】在线教育平台项目总结

    1.项目总体描述 在线教育平台采用了B2C商业模块,基于微服务架构,采用前后端分离的方式进行开发 2.功能模块 基于前后台的模式开发,前台系统是给使用这个平台进行学习的用户,后台系统是给管理员使用的 ...

  6. Django项目于之在线教育平台网站的实战开发(三)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :Django项目于之在线教育平台网站的实战开发(二)_cdtaogang's blog-CSDN博客 ...

  7. 第三百八十九节,Django+Xadmin打造上线标准的在线教育平台—列表筛选结合分页...

    第三百八十九节,Django+Xadmin打造上线标准的在线教育平台-列表筛选结合分页 根据用户的筛选条件来结合分页 实现原理就是,当用户点击一个筛选条件时,通过get请求方式传参将筛选的id或者值, ...

  8. 在线教育平台项目——整体架构

    Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. 有一段时间没好好写文章了,可不 ...

  9. 在线教育行业十大盈利模式分析

    在商言商,在线教育作为新兴的商业机会,利益是支撑一个行业持续与良好发展下去的核心.如果在线教育得不到有利的套现,那么又将是一个空中楼阁,虚幻的泡沫.众所周知,课程收费是众多教育机构的核心盈利模式,那么 ...

  10. 对某在线教育平台用户使用RFM模型按价值分类

    对某在线教育平台用户使用RFM模型按价值分类 说在前面 项目背景 RFM分析 RFM分析过程 明确目的 分析原因 对R,F,M值进行定义 统计R,F,M值 给R,F,M值"打分" ...

最新文章

  1. 贝壳大数据OLAP平台架构演进
  2. Union定义变量进行外部调用的方法
  3. 很酷的word技巧---删除行前的空格
  4. 【Android 修炼手册】Gradle 篇 -- Gradle 源码分析
  5. SQL语句大全,所有的SQL都在这里 !极度建议收藏...
  6. android 480p分辨率,[RK3399][Android7.1] HDMI显示屏(副屏)调试记录小结
  7. poj 1456 Supermarket 贪心+并查集(个人感觉有点难判断出来
  8. axios的介绍与页面配置---axios工作笔记003
  9. img 显示默认图片,及动态赋值
  10. linux在当前目录下打开终端,linux - 终端:在窗口中打开当前路径? - Ubuntu问答...
  11. PyTorch学习笔记——词向量简介
  12. Java中split方法对结尾空字符串不正确处理的解决方案
  13. Linux基础命令介绍七:网络传输与安全 wget curl rsync iptables
  14. 暴风影音 2007 播放 avi 时出现两个画面的解决办法
  15. 游戏安全02:手游外挂简单分类和实现原理介绍
  16. 香蜜经典句子摘抄,哪句勾起了你的回忆
  17. linux下回收站无法清空 解决
  18. 用Excel生成Ansys *VREAD函数所需的具有固定字符长度和小数位数的数据
  19. 加拿大移民政策利好,哪些人适合移民加拿大
  20. Pytorch 学习(2):神经网络及训练一个分类器(cifar10_tutorial的网络结构图)

热门文章

  1. 使用超以太网来降低LED照明的成本
  2. ltspice语言中文_LTspice 一 简介(中文教程)
  3. 在centos中配置固定ip
  4. STM32F103-LED模块
  5. 有关计算机病毒的说法中正确的是,以下有关计算机病毒的说法中,正确的是()。A.计算机病毒是一些人为编制的程序B.计算机病毒具有隐蔽...
  6. 《程序员修炼之道——从小工到专家》读后感一
  7. 重庆交通大学2020级程序设计方法期末考试 题解
  8. 利用jieba分词分析小说三
  9. 【SystemTap】SystemTap的疑问
  10. 打车应用生死未卜 嘀嘀或傍上腾讯