day73-BBS-登录功能、首页搭建、admin、头像、图片防盗、个人站点、侧边栏筛选

每日测验

"""
今日日考
1.img标签src属性可以指代的值有哪些,各有什么特点
2.pillow模块是干什么用的,主要的方法有哪些
3.简述登陆功能图片验证码相关逻辑
4.纯手撸能够生成五位数的随机验证码代码
"""

昨日内容回顾

  • 模型表的创建

    """
    1.用户表需要继承AbstractUser
    2.自关联字段
    	eg:根评论和子评论
    3.数据库设计字段优化
    """
    
  • 注册功能

    """
    1.书写了一个注册需要的forms组件
    	规律:不同的功能代码应该接耦合单独存储
    		1.只有一个forms组件,那么可以直接创建一个py文件
    		2.有多个forms组件,你可以创建文件夹,内部根据功能的不同创建不同的py文件
    
    2.利用forms组件渲染前端标签
    	1.我们不利用form表单提交而是用ajax提交
    	2.但是我们需要用到form标签来包含我们所有的获取用户数据的html代码
    		$('#form').serializeArray()
    			获取到form标签内所有用户普通键值对的数据
    				[{},{},{},{}]
    3.手动渲染获取用户头像的标签
    	<label for="myfile">头像
        {% load static %}
        <img src="{% static 'img/default.png' %}" id='myimg' alt="" width="100" style="margin-left: 10px">
      </label>
      <input type="file" id="myfile" name="avatar" style="display: none" >
       只要是label里面的内容点击都会跳转到for指定的标签上
    
    4.如何实时展示用户头像
    	1.利用到了文件阅读器
    	2.change事件
    	3.onload等待加载完毕
    
    5.一旦用户信息不合法如何精确的渲染提示信息
    	1.forms组件渲染的标签id值都有一个固定的特点
    		id_字段名
    		ps:如何获取id值呢	form.auto_id
    			<label for="{
          
          { form.auto_id }}">{
          
          { form.label }}</label>
    	2.根据后端返回的字段以及字段对应的报错信息
    		自己手动拼接对应字段的id值
    	3.提示功能的完善
    		1.jQuery的链式操作
    		2.input获取焦点事件
    """
    
  • 登陆功能

    """
    1.自己手动搭建获取用户用户名 密码 验证码前端标签代码
    
    2.图片验证码如何自己完成
    	ps:
    		img标签src属性后面可以写的内容
    			1.直接写网络图片地址
    			2.仅仅只是一个url后缀(自动朝该url发送get请求获取数据)
    			3.图片二进制数据
    	
    	1.需要借助于pillow模块
    		Image,ImageDraw,ImageFont
    	2.需要借助于内存管理器io模块
    		BytesIo,StringIO
    	3.字体样式其实是受.ttf结尾的文件控制的
    	4.手动产生随机验证码(搜狗公司的笔试题)
    		random模块
    		chr内置方法
    		在session中保存验证码
    """
    

今日内容概要

  • 登陆功能
  • bbs首页搭建
    • 导航条用户功能
  • admin后台管理
  • 首页文章展示
  • 用户头像展示(media配置)
  • 图片防盗链
  • 个人站点页面搭建
  • 侧边栏展示功能
    • 标签
    • 分类
    • 日期
  • 侧边栏筛选功能
  • 将侧边栏制作成inclusion_tag

登陆功能

def login(request):
    if request.method == 'POST':
        back_dic = {
    
    'code':1000,'msg':''}
        username = request.POST.get('username')
        password = request.POST.get('password')
        code = request.POST.get('code')
        # 1 先校验验证码是否正确      自己决定是否忽略            统一转大写或者小写再比较
        if request.session.get('code').upper() == code.upper():
            # 2 校验用户名和密码是否正确
            user_obj = auth.authenticate(request,username=username,password=password)
            if user_obj:
                # 保存用户状态
                auth.login(request,user_obj)
                back_dic['url'] = '/home/'
            else:
                back_dic['code'] = 2000
                back_dic['msg'] = '用户名或密码错误'
        else:
            back_dic['code'] = 3000
            back_dic['msg'] = '验证码错误'
        return JsonResponse(back_dic)
    return render(request,'login.html')

首页搭建

# 1.动态展示用户名称
          {
    
    % if request.user.is_authenticated %}
                <li><a href="#">{
    
    {
    
     request.user.username }}</a></li>
                <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">更多操作 <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">修改密码</a></li>
            <li><a href="#">修改头像</a></li>
            <li><a href="#">后台管理</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">退出登陆</a></li>
          </ul>
        </li>
          {
    
    % else %}
                <li><a href="{% url 'reg' %}">注册</a></li>
                <li><a href="{% url 'login' %}">登陆</a></li>
          {
    
    % endif %}
          
# 更多操作

admin后台管理

"""
django给你提供了一个可视化的界面用来让你方便的对你的模型表
进行数据的增删改查操作

如果你先想要使用amdin后台管理操作模型表
你需要先注册你的模型表告诉admin你需要操作哪些表

去你的应用下的admin.py中注册你的模型表
	from django.contrib import admin
  from app01 import models
  # Register your models here.

  admin.site.register(models.UserInfo)
  admin.site.register(models.Blog)
  admin.site.register(models.Category)
  admin.site.register(models.Tag)
  admin.site.register(models.Article)
  admin.site.register(models.Article2Tag)
  admin.site.register(models.UpAndDown)
  admin.site.register(models.Comment)
"""
# admin会给每一个注册了的模型表自动生成增删改查四条url
http://127.0.0.1:8000/admin/app01/userinfo/  查
http://127.0.0.1:8000/admin/app01/userinfo/add/  增
http://127.0.0.1:8000/admin/app01/userinfo/1/change/  改
http://127.0.0.1:8000/admin/app01/userinfo/1/delete/  删
    
    
http://127.0.0.1:8000/admin/app01/blog/  查
http://127.0.0.1:8000/admin/app01/blog/add/  增
http://127.0.0.1:8000/admin/app01/blog/1/change/  改
http://127.0.0.1:8000/admin/app01/blog/1/delete/"""
关键点就在于urls.py中的第一条自带的url

前期我们需要自己手动苦逼的录入数据,自己克服一下
"""

# 1.数据绑定尤其需要注意的是用户和个人站点不要忘记绑定了

# 2.标签

# 3.标签和文章
	千万不要把别人的文章绑定标签

用户头像展示

"""
1 网址所使用的静态文件默认放在static文件夹下
2 用户上传的静态文件也应该单独放在某个文件夹下

media配置
	该配置可以让用户上传的所有文件都固定存放在某一个指定的文件夹下
	# 配置用户上传的文件存储位置
	MEDIA_ROOT = os.path.join(BASE_DIR,'media')  # 文件名 随你 自己
	会自动创建多级目录
	
如何开设后端指定文件夹资源
	首先你需要自己去urls.py书写固定的代码
	from django.views.static import serve
	from BBS14 import settings
		
	# 暴露后端指定文件夹资源
  url(r'^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT})
  
"""

图片防盗链

# 如何避免别的网站直接通过本网站的url访问本网站资源

# 简单的防盗
	我可以做到请求来的时候先看看当前请求是从哪个网站过来的
  如果是本网站那么正常访问
  如果是其他网站直接拒绝
  	请求头里面有一个专门记录请求来自于哪个网址的参数
    	Referer: http://127.0.0.1:8000/xxx/

# 如何避免
	1.要么修改请求头referer
  2.直接写爬虫把对方网址的所有资源直接下载到我们自己的服务器上

个人站点

# 全是每个用户都可以有自己的站点样式
<link rel="stylesheet" href="/media/css/{
    
    { blog.site_theme }}/">



id		content 			  create_time					month
1			111							 2020-11-11					2020-11
2			222							 2020-11-12					2020-11
3			333							 2020-11-13					2020-11
4			444							 2020-11-14					2020-11
5			555							 2020-11-15					2020-11
"""
django官网提供的一个orm语法
	from django.db.models.functions import TruncMonth
-官方提供
			from django.db.models.functions import TruncMonth
			Sales.objects
			.annotate(month=TruncMonth('timestamp'))  # Truncate to month and add to select list
			.values('month')  # Group By month
			.annotate(c=Count('id'))  # Select the count of the grouping
			.values('month', 'c')  # (might be redundant, haven't tested) select month and count
			
			
时区问题报错
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
"""

侧边栏筛选功能

https://www.cnblogs.com/jason/tag/Python/  				 标签
https://www.cnblogs.com/jason/category/850028.html 分类
https://www.cnblogs.com/jason/archive/2016/10.html 日期
  
  
https://www.cnblogs.com/jason/tag/1/  				 标签
https://www.cnblogs.com/jason/category/1 			 分类
https://www.cnblogs.com/jason/archive/2020-11/ 日期
  
  
  
def site(request,username,**kwargs):
    """
    :param request:
    :param username:
    :param kwargs: 如果该参数有值 也就意味着需要对article_list做额外的筛选操作
    :return:
    """
    # 先校验当前用户名对应的个人站点是否存在
    user_obj = models.UserInfo.objects.filter(username=username).first()
    # 用户如果不存在应该返回一个404页面
    if not user_obj:
        return render(request,'errors.html')
    blog = user_obj.blog
    # 查询当前个人站点下的所有的文章
    article_list = models.Article.objects.filter(blog=blog)  # queryset对象 侧边栏的筛选其实就是对article_list再进一步筛选
    if kwargs:
        # print(kwargs)  # {'condition': 'tag', 'param': '1'}
        condition = kwargs.get('condition')
        param = kwargs.get('param')
        # 判断用户到底想按照哪个条件筛选数据
        if condition == 'category':
            article_list = article_list.filter(category_id=param)
        elif condition == 'tag':
            article_list = article_list.filter(tags__id=param)
        else:
            year,month = param.split('-')  # 2020-11  [2020,11]
            article_list = article_list.filter(create_time__year=year,create_time__month=month)


    # 1 查询当前用户所有的分类及分类下的文章数
    category_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values_list('name','count_num','pk')
    # print(category_list)  # <QuerySet [('jason的分类一', 2), ('jason的分类二', 1), ('jason的分类三', 1)]>

    # 2 查询当前用户所有的标签及标签下的文章数
    tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values_list('name','count_num','pk')
    # print(tag_list)  # <QuerySet [('tank的标签一', 1), ('tank的标签二', 1), ('tank的标签三', 2)]>

    # 3 按照年月统计所有的文章
    date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(count_num=Count('pk')).values_list('month','count_num')
    # print(date_list)

    return render(request,'site.html',locals())

猜你喜欢

转载自blog.csdn.net/zdw20190510/article/details/113573967