23-Django其它

配置执行MySQL自动打印SQL语句

# settings.py
# 1. 添加下面到settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

# 2. DEBUG = False
DEBUG = False


"""
In [4]: models.Blog.objects.all()
Out[4]: (0.000) SELECT `blog`.`id`, `blog`.`create_time`, `blog`.`update_time`, `blog`.`site_name`, `blog`.`site_title`, `blog`.`site_theme` FROM `blog` LIMIT 21; args=()
<QuerySet []>
"""

修改时区为本地的两种方式

# 1. 正常设置
# 默认是
LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC"

# 修改为
LANGUAGE_CODE = "zh-hans"
TIME_ZONE = "Asia/Shanghai"

# 2. 不用修改LANGUAGE_CODE 以及 TIME_ZONE 直接修改 USE_TZ = False 即可
USE_TZ = False

点击按钮通过Ajax实时切换图片

# 路由
path('girl/', views.beautiful_girls, name='girl')

# inclusion_tag
import requests
from django import template

# 创建一个注册对象  这里只能叫 register
register = template.Library()

@register.inclusion_tag('tags/adv_girls.html')
def beautiful_girls():
    url = 'https://imgapi.cn/api.php'
    # 禁止自动重定向
    response = requests.get(url, allow_redirects=False)
    img_url = response.headers['Location']
    return locals()



# 视图
import requests
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def beautiful_girls(request):
    url = 'https://imgapi.cn/api.php'
    # 禁止自动重定向
    response = requests.get(url, allow_redirects=False)
    img_url = response.headers['Location']

    if request.is_ajax():
        return CommonResponse(status=200, url=img_url)
    else:
        print('没有获取到Ajax数据')
<!-- 前端 保留核心代码 省略其它 -->
<img id="img-girl" src="{{ img_url }}" alt="好看的小姐姐">
<p><a href="{% url 'home' %}" id="ggirl" class="btn btn-primary btn-block" role="button">点我切换小姐姐</a></p>
<script>
    $('#ggirl').click(function(e){
        // 阻止默认行为
        e.preventDefault();
        $.ajax({
            type:'POST',
            // 这里一定要用绝对的路径 路由层的name是girl app名称是blog
            url: '/blog/girl/',
            // 这里不需要发送数据过去 所以发送一个空
            data:{},
            success: (response)=>{
                // 直接替换
                document.querySelector('#img-girl').src = response.url;
            }
        })
    })
</script>

当get传递的是汉字,后端进行解码

# 方案1 
from urllib.parse import unquote

def article_left(request):
    # 获取路径
    path = request.get_full_path()
    # 转换路径  因为前端传过来的可能是汉字
    path = unquote(path)
    # 得到用户名
    username = path.split('/')[3]
# 方案2
from django.utils.http import unquote

def article_left(request):
    # 获取路径
    path = request.get_full_path()
    # 转换路径  因为前端传过来的可能是汉字
    path = unquote(path)
    # 得到用户名
    username = path.split('/')[3]

Django常用模块导入

# render: 用于渲染模板并返回HttpResponse对象
# HttpResponse: 返回一个文本响应
# redirect: 重定向到指定URL
# reverse: 根据视图名称反向解析URL
# get_object_or_404: 获取模型对象,如果不存在则返回404页面
from django.shortcuts import render, HttpResponse, redirect, reverse, get_object_or_404

# JsonResponse: 返回JSON格式的响应
# Http404: 抛出404异常
from django.http import JsonResponse, Http404

# path: 定义URL路径
# re_path: 使用正则表达式定义URL路径
from django.urls import path, re_path

# models: Django模型类的基类
# transaction: 数据库事务相关
from django.db import models, transaction

# timezone: Django中处理时区相关的工具
from django.utils import timezone

# login_required: 限制用户登录状态的装饰器
from django.contrib.auth.decorators import login_required

# serializers: 用于序列化和反序列化数据
from django.core import serializers

# Max: 聚合函数,返回给定字段的最大值
# Min: 聚合函数,返回给定字段的最小值
# Sum: 聚合函数,返回给定字段的总和
# Count: 聚合函数,返回查询结果的数量
# Avg: 聚合函数,返回给定字段的平均值
from django.db.models import Max, Min, Sum, Count, Avg

# User: Django内置的用户模型
# AbstractUser: Django提供的用户模型抽象基类
from django.contrib.auth.models import User, AbstractUser

# Paginator: 分页器,用于分页查询结果
# EmptyPage: 分页结果为空时引发的异常
# PageNotAnInteger: 请求页码不是整数时引发的异常
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

# MiddlewareMixin: 中间件类的基类
from django.utils.deprecation import MiddlewareMixin  

# urlquote: 将URL字符串中的特殊字符进行编码
# urlencode: 将字典编码为URL查询字符串
# urlunquote: 将URL编码的字符串解码为原始形式
from django.utils.http import urlquote, urlencode, urlunquote

# csrf_exempt: 用于标记视图函数以豁免CSRF保护
from django.views.decorators.csrf import csrf_exempt

# 导入用于按月和按年截断日期时间字段的函数
from django.db.models.functions import TruncMonth, TruncYear

# 导入用于提供静态文件的serve函数
from django.views.static import serve

# 导入用于标记字符串为安全的HTML内容的函数
from django.utils.safestring import mark_safe

Django配置404以及500页面

配置页面之前需要了解的事情:

  1. settings中,默认是DEBUG=True,也就是所谓的测试环境,这时候的静态文件路径可以正常访问到。
  2. 当设置为DEBUG=False后,环境就变成生成环境了。Django就会认为我们的项目上线了,已经部署到服务器上面了,这个时候配置的STATICFILES_DIRS路径就会失效,因为这个路径只是为了测试服务器去找的,可以自行改成False后,通过Ctrl + F5强制刷新验证。
  3. 设置为生成环境后自己的js/css/全部静态文件都会失效。

怎么配置404/500页面:

  1. 去你的templates下面配置一个静态网页,名称随意,我这里就叫做handler404.html,内容可以自己去写。
  2. 配置视图函数,如果报错,配置的时候加上exception形参,然后render这里再加一个status=404或者500,返回这个页面。
  3. 去主urls下面设置:
    1. handler404 = 'appname.views.path'
    2. handler500 = 'appname.views.path'
    3. 注意,上面的变量名不能变!
  4. 去settings中,设置:DEBUG=FalseALLOWED_HOSTS=['*']

image-20240328105724613

QuerySet()对象转纯字典 QuerySet().dict()

request.GET.dict()
request.POST.dict()

模型对象转字典 model_to_dict()

# 使用需要导入 
from django.forms.models import model_to_dict


obj = Book.objects.filter(pk=1).filter()
data = model_to_dict(obj)  # 得到字典

# 注意,这个方法只有单个对象才可以使用 多个对象不支持

解决跨域

方式1:第三方模块

# 统一按如下方式解决跨域
	-1 安装
    	pip3 install django-cors-headers
    -2 app中注册
        INSTALLED_APPS = [
            。。。
            'corsheaders',
        ]
    -3 中间件中注册
        MIDDLEWARE = [
            'corsheaders.middleware.CorsMiddleware',
        ]
    -4 配置文件中配置
    # 允许跨域源
    CORS_ORIGIN_ALLOW_ALL = True
    # 允许的请求头
    CORS_ALLOW_HEADERS = (
        "accept",
        "accept-encoding",
        "authorization",
        "content-type",
        "dnt",
        "origin",
        "user-agent",
        "x-csrftoken",
        "x-requested-with",

        # 额外允许的请求头
        'token',
    )

方式2:中间件

from django.utils.deprecation import MiddlewareMixin


class CorsMiddleWareMixin(MiddlewareMixin):
    def process_response(self, request, response):
        if request.method.upper() == "OPTIONS":  # 非简单请求
            # 写 * 也可以 写 Content-Type 也可以
            response["Access-Control-Allow-Headers"] = "*"  # 允许所有的请求头
            response["Access-Control-Allow-Methods"] = "*"  # 允许所有的请求方式 
             
        response['Access-Control-Allow-Origin'] = "*" # 允许所有的非简单请求
        return response
    
# settings.py中注册中间件
MIDDLEWARE = [
    "luffy_api.base_middlewaremixin.CorsMiddleWareMixin",  # 自定义的跨域中间件
	# ...
]

创建一个干净的DRF环境

# 1. 删除全部app,只留下自己的
INSTALLED_APPS = [
    "django.contrib.staticfiles", # 注意,这个app不建议删除,不然没有样式了。
    
    
    'rest_framework',
    "app01"
]

# 2. 删除全部中间件, 删除或注销都可以,包括这MIDDLEWARE=[] 也可以删除
MIDDLEWARE = [

]

# 3. 主urls.py 干掉默认的admin path
urlpatterns = [
    # 默认的admin被删掉了
    path("api/v1/", include("app01.urls"))
]

# 4. 最关键的一步,settings中设置即可
REST_FRAMEWORK = {
    "UNAUTHENTICATED_USER": None,
}
posted @ 2024-03-23 01:21  小满三岁啦  阅读(4)  评论(0编辑  收藏  举报