day73-bbs-3

登錄功能

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())
本站公眾號
   歡迎關注本站公眾號,獲取更多信息