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页面
配置页面之前需要了解的事情:
- settings中,默认是
DEBUG=True
,也就是所谓的测试环境,这时候的静态文件路径可以正常访问到。- 当设置为
DEBUG=False
后,环境就变成生成环境了。Django就会认为我们的项目上线了,已经部署到服务器上面了,这个时候配置的STATICFILES_DIRS
路径就会失效,因为这个路径只是为了测试服务器去找的,可以自行改成False后,通过Ctrl + F5强制刷新验证。- 设置为生成环境后自己的js/css/全部静态文件都会失效。
怎么配置404/500页面:
- 去你的templates下面配置一个静态网页,名称随意,我这里就叫做
handler404.html
,内容可以自己去写。 - 配置视图函数,如果报错,配置的时候加上exception形参,然后render这里再加一个status=404或者500,返回这个页面。
- 去主urls下面设置:
handler404 = 'appname.views.path'
handler500 = 'appname.views.path'
- 注意,上面的变量名不能变!
- 去settings中,设置:
DEBUG=False
和ALLOWED_HOSTS=['*']
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,
}
本文作者:小满三岁啦
本文链接:https://www.cnblogs.com/ccsvip/p/18090698
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。