【Python】从0开始的Django基础
Django框架基础
- unit01
- 一、`Django`基础
- 1.1 什么是`Django?`
- 1.2 安装与卸载
- 1.2.1 `Python`与`Django`的版本
- 1.2.2 安装
- 1.2.3 查看`Django`版本
- 1.2.4 卸载
- 二、`Django`项目
- 2.1 概述
- 2.2 创建项目
- 2.3 启动项目
- 2.4 项目的目录结构
- 2.5 配置
- 三、`URL` 调度器
- 3.2 定义`URL`路由
- 3.2 定义首页的路由
- 3.3 便捷管理路由及视图函数
- 3.4 路径转换器
- 3.4.1 `int`
- 3.4.2 `str`
- 3.4.3 `slug`
- 3.4.4 `uuid`
- 3.4.5 `path`
- 四、模块
- 4.1 创建模块
- 4.2 注册模块
- 4.3 分布式路由
- unit02
- 一、`DTL`
- 1.1 什么是`DTL?`
- 1.2 模板配置
- 1.3 `render()`函数
- 二、`DTL`
- 2.1 变量
- 2.2 标签
- 2.2.1 `for`标签
- 2.2.2 `if`标签
- 2.2.3 表单
- 2.2.4 `csrf_token`
- 2.2.5 静态资源
- 2.2.5.1 静态资源的配置
- 2.2.5.2 访问静态资源
- unit03
- 一、`DTL`
- 1.1 标签
- `include`标签
- `cycle`标签
- 注释
- 1.2 过滤器
- `safe`
- `striptags`
- `truncatechars`
- `floatformat`
- `date`
- `yesno`
- `join`
- 二、`Http`请求
- 3.1 属性
- `method`属性
- `POST`属性
- `GET`属性
- 具有浏览框的表单的限制
- `FILES`属性
- 3.2 `QueryDict`对象
- unit04
- 一、`HTTP`响应
- 二、模型
- 2.1 概述
- 2.2 配置
- 2.3 创建模型
- 2.4 数据类型
- 2.5 数据迁移
- 三、管理器
- 四、`QuerySet`
- `all()`方法
- `get()`
- `filter()`
- `first()`
- `last()`
- `order_by()`
- 查询谓语
- `F`函数
- unit05
- 一、模型
- `values()`
- `values_list()`
- `only()`
- `query`
- `Q`函数
- `exclude()`
- `count()`
- `aggregate()`
- `annotate`
- unit 06
- 一、`HttpRequest`对象
unit01
一、Django
基础
1.1 什么是Django?
Django
是一个基于Python
语言的、开源的、重量级的WEB
开发框架。
Django
适用于开发各类WEB
应用程序,包括但不限于电商网站、博客等。
Django
的官网:http://www.djangoproject.com
1.2 安装与卸载
1.2.1 Python
与Django
的版本
Django 版本 | Python 版本 |
---|---|
3.2 | 3.6, 3.7, 3.8, 3.9, 3.10 (在 3.2.9 中就已经加入了) |
4.0 | 3.8,3.9,3.10 |
4.1 | 3.8,3.9,3.10,3.11(4.1.3 添加) |
4.2 | 3.8, 3.9, 3.10, 3.11, 3.12 (4.2.8 添加) |
5.0 | 3.10、3.11、3.12 |
1.2.2 安装
$ pip3 install django[==version]
1.2.3 查看Django
版本
$ python3 -m django --version
$ django-admin --version
1.2.4 卸载
$ pip3 uninstall django
二、Django
项目
2.1 概述
Django
项目由一个或多个应用程序(指模块)组成,在每个模块中有相对独立的路由、视图、模型、模板等。
2.2 创建项目
$ django-admin startproject projectname
2.3 启动项目
第一步:在命令行输入以下命令:
$ python3 manage.py runserver [[address:]port]
如:
$ python3 manage.py runserver
$ python3 manage.py runserver 8888
$ python3 manage.py runserver 0.0.0.0:8888
第二步:启动浏览器输入地址即可
在Pycharm
中启动Django
项目
第一步:鼠标右击manage.py
,然后从弹出的快捷菜单中选择Modify Run Configuration
,再在Parameters
文本框中输入runserver [[address:]port]
第二步:鼠标右击manage.py
,然后从弹出的快捷菜单中选择Run manage
2.4 项目的目录结构
djangoBasic/,项目根目录
├── db.sqlite3,默认的sqlite3数据库文件
├── djangoBasic,内层目录 -- 包
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py,项目配置文件
│ ├── urls.py,根路由文件
│ └── wsgi.py
└── manage.py,入口文件
2.5 配置
# 项目的根目录
BASE_DIR = Path(__file__).resolve().parent.parent# 是否开启调试模式:在开发环境中需要开启调试模式,在生产环境中需要关闭调试模式
DEBUG = True# 已安装且启动的应用程序(模块)
INSTALLED_APPS = []# 已安装且启用的中间件
MIDDLEWARE = []# 项目的根路由
ROOT_URLCONF = 'djangoBasic.urls'# 模板(`Templates`)的配置
TEMPLATES = []# 数据库的配置
DATABASES = {}# 语言代码
LANGUAGE_CODE = 'zh-Hans'# 时区
TIME_ZONE = 'Asia/Shanghai'
三、URL
调度器
URL
调度器也称为URL
路由,它允许程序员自由的设计URL
地址
3.2 定义URL
路由
第一步:在根路由文件(urls.py
)中定义路由
path(router,view)
URL
地址为字母、数字、下划线、短横线的组合
如:
path('hello/',????)
第二步:定义(视图)函数
def function_name(request):......
如:
def hello(request):print('Hello Django')
相对完整的示例代码如下:
# 函数
def hello(request):print('Hello,Django')# 路由
urlpatterns = [# ....#代表的是当通过 http://127.0.0.1:8000/hello/访问时,将调用hello函数path('hello/',hello),
]
运行结果如下:
此时产生错误的原因是:(视图)函数没有返回响应对象
在Django.http
包中提供了HttpResponse
类,它用于完成Http
响应,所以:
from django.http import HttpResponse
# 函数
def hello(request):return HttpResponse('Hello,Django')
此时的运行结果如下:
第三步:通过链接或表单的action
来访问相关的路由
此时产生了另外的两个问题:
第一:如果来访问http://127.0.0.1:8000
时将产生404
错误 – 怎么解决?
第二:现在在urls.py
中既有路由又有视图函数 – 不便于管理 – 如何便捷管理?
3.2 定义首页的路由
path('',视图函数)
示例代码
from django.http import HttpResponsedef index(request):return HttpResponse('Index Page')urlpatterns = [# 首页路由path('',index),
]
3.3 便捷管理路由及视图函数
为了便于管理视图函数,强烈建议将视图函数存储到views.py
中,然后再在urls.py
中引用该模块即可
urls.py
的示例代码如下:
from django.contrib import admin
from django.urls import path
from . import viewsurlpatterns = [path('admin/', admin.site.urls),path('', views.index),path('hello/', views.hello),
]
views.py
的示例代码如下:
from django.http import HttpResponsedef hello(request):return HttpResponse('Hello Django')def index(request):return HttpResponse('Index Page')
对于静态的路由可以直接按需要进行定义,但是对于动态的路由,如访问某一个文章时的ID
,此时如何定义?
3.4 路径转换器
路径转换器主要解决动态路由的问题,如:
http://127.0.0.1:8000/user/<id>
路径转换器的基本语法:
path("<类型:参数名称>/<类型:参数名称>",视图函数)
需要注意的是:在定义视图函数时,如果路由中存在路径转换器,那么视图函数也必须存在相同名称的参数
3.4.1 int
int
类型的路径转换器自动匹配正整数,类型为int
,如:
path("users/<int:id>",views.userinfo),
userinfo
的函数代码示例如下:
def userinfo(request,id):.......
3.4.2 str
str
类型的路径转换器自动匹配字符串,/
除外,类型为str
,如:
path("topic/<str:topic>/",views.topic),
3.4.3 slug
slug
匹配任意由字母、数字、短横线与下划线组成的字符,其类型为str
,如:
path('blog/<slug:title>',views.blog),
3.4.4 uuid
UUID
的格式为8-4-4-4-12
的十六位进制数字组成,其类型为uuid
Python
的uuid
模块import uuid# 基于当前服务器ID和时间 uuid.uuid1() # 基于随机数 uuid.uuid4()
3.4.5 path
path
匹配路径,包括/
path('download/<path:path>/',views.download),
组合使用的案例
path('carts/<str:username>/id/<int:id>/',views.carts),path('<str:username>/<int:id>/',views.goods),
四、模块
每个Django
项目至少存在一个模块(应用程序)
4.1 创建模块
$ python3 manage.py startapp app_name
如:
$ python3 manage.py startapp users$ python3 manage.py startapp goods
4.2 注册模块
将创建的模块名称添加到配置文件的INSTALLED_APPS
列表中,如:
INSTALLED_APPS = [# ...'goods','users',
]
4.3 分布式路由
所谓的分布式路由是将某个模块下以共同字符串开头的路由写在根路由文件中,不同的部分写在模块内部的urls.py
中,当访问时系统将自动把两个部分的URL
进行拼接。
include()
函数位于django.urls
模块内,其作用是将当前路由与指定包含文件的路由进行拼接
include("URLS文件")
# urls.py最简陋的样子
from django.urls import path
from . import viewsurlpatterns = [path('',views.index),
]
# views.py最简陋的样子
def index(request):......
unit02
一、DTL
1.1 什么是DTL?
DTL(Django Templates Language)
,Django
模板语言,实际上就是将HTML
页面与程序代码进行混合的技术。
1.2 模板配置
#模板配置
TEMPLATES = [{# 模板的引擎'BACKEND': 'django.template.backends.django.DjangoTemplates',# 配置模板文件的路径'DIRS': [BASE_DIR / 'templates'],# 是否查找模块下的目录'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]
1.3 render()
函数
render()
函数位于django.shortcuts
模板内:
from django.shortcuts import render
render()
函数的语法结构为:
render(request,template_name,context=None)
request
代表的HttpRequest
对象
template_name
指要渲染的模板文件路径及名称
context
指要传递到模板的数据,其类型必须为dict
二、DTL
模板文件内可以使用:注释、变量、标签等
2.1 变量
# 变量
{{ variable_name }}
# 列表或元组
{{ variable_name.index }}
# 字典
{{ variable_name.key }}
#对象属性
{{ variable_name.property }}
#对象方法
{{ varible_name.method s}}
2.2 标签
标签是指模板中进行逻辑控制的代码,如分支结构、循环结构等,标签的基本语法结构为:
{% 标签名称 %}或者{% 开始标签名称 %}
...
...
{% 结束标签名称%}
2.2.1 for
标签
{% for variable in iterable %}......
{% endfor %}
{% for variable in iterable %}......
{% empty %}......
{% endfor %}
在DTL
中为循环提供了在其内部使用的变量:
变量 | 描述 |
---|---|
forloop.counter | 正向循环计数器,从1开始 |
forloop.counter0 | 正向循环计数器,从0开始 |
forloop.revcounter | 反向循环计数器,从1开始 |
forloop.revcounter0 | 反向循环计数器,从0开始 |
forloop.first | 当前循环为第一次循环时为True |
forloop.last | 当前循环为最后一次循环时为True |
2.2.2 if
标签
{% if condition %}...
{% endif %}{% if condition %}...
{% else %}...
{% endif %}{% if condition %}...
{% elif condition %}...
{% elif condition %}...
{% else %}...
{% endif %}
2.2.3 表单
1.表单的action
属性值为空或者省略action
属性,代表表单将提交给自身
2.表单的method
属性值为空或者省略method
属性,代表表单的提交方式为get
2.2.4 csrf_token
{% csrf_token %}
在以post
方式提交的表单内必须在使用{% csrf_token %}
产生令牌
当在表单内添加{% csrf_token %}
标签后将产生个名称为csrfmiddlewaretoken
的隐藏域
<input type="hidden" name="csrfmiddlewaretoken" value="7erwqas">
2.2.5 静态资源
静态资源是网站用于布局的样式文件、图片文件及脚本文件。
2.2.5.1 静态资源的配置
# 静态文件的路由
STATIC_URL = '/static/'# 静态文件的位置
STATICFILES_DIRS = [BASE_DIR / 'static'
]
2.2.5.2 访问静态资源
第一步:通过{% load static %}
标签加载static
标签
{% load static %}
第二步:在模板文件中通过static
标签来访问静态资源
{% static '静态文件的的路径及名称' %}
被静态文件引用的文件(如在CSS
文件内引用图片),因为该静态文件没有经过模板引擎处理,所以不能使用{% static %}
标签来加载 – 只能通过其相对路径实现
unit03
一、DTL
1.1 标签
include
标签
include
标签用于在一个模板文件中包含另外一个模板文件,语法结构为:
{% include '被包含的模板文件的位置及名称' with variable=value variable=value %}
cycle
标签
当每次遇到cycle
标签时都会产生一个值,第一次产生第一个值,第二个产生第二值,依次类推。当值用尽时,再次遇到该标签时,就产生第一个值。
{% cycle 'value1' 'value2' 'value3' ... %}
注释
{# 这是一个单行注释 #}{% comment %}第一行第二行
{% endcomment%}
1.2 过滤器
过滤器用于转换变量或标签参数的值,其基本语法结构为:
{{ 变量名称|过滤器:参数:参数 }}
safe
当通过变量向模板文件传递HTML
内容时,在模板中将把HTML
内容中的特殊符号进行替换操作,如>
替换为>
,<
替换为<
。
之所以进行替换的原因是为了防止XSS(Cross-site scripting)
攻击(译为跨站脚本攻击)。举例说明:
假设在某个网站中对于某条新闻发表了评论,内容如下:
这篇新闻很好
<script>
while(true){window.alert("哈哈哈");
}
</script>
当用户发表该评论后,其内容将写入到服务器的数据库 — 不会产生任何问题
但是,如果该评论被某个用户通过浏览器进行访问时,那么其中的
<script>
while(true){window.alert("哈哈哈");
}
</script>
将被浏览器认为是JavaScript
脚本 - - 并且为死循环!!!
如何解决 – 将输入的>
、<
等替换为对于HTML
实体,如果此时再有用户输入以下评论:
这篇新闻很好
<script>
while(true){window.alert("哈哈哈");
}
</script>
将输入的>
、<
等替换为对于HTML
实体的结果为:
这篇新闻很好<script>
while(true){window.alert("哈哈哈");
}
</script>
在Django
模板中如果认为传递到模板的HTML
内容为安全内容,则需要通过safe
过滤器
striptags
striptags
过滤器用于去掉所有的HTML
标记
truncatechars
truncatechars
过滤器用于截断字符串并且指定长度
floatformat
floatformat
过滤器用于对浮点数进行四舍五入
date
date
过滤器用于格式化日期和时间
格式 | 描述 |
---|---|
Y | 年 |
m | 月,带有前导零 |
d | 日,带有前导零 |
H | 小时,带有前导零 |
i | 分钟,带有前导零 |
s | 秒,带有前导零 |
yesno
将True,False,None(可选)
的值映射到以逗号分隔的字符串
join
join
过滤器使用指定的分隔符将列表成员连接成字符串
二、Http
请求
当一个url
被请求时,Django
会自动创建HttpRequest
对象,在该对象内包含的请求的元数据,然后再加载相应的视图函数,并且将HttpRequest
对象作为视图函数的第一个参数
# 当前request参数代表的就是HttpRequest对象
def function_name(request):......
HttpRequest
对象存在的属性除非另有说明外都是只读属性
3.1 属性
method
属性
method
属性用于获取HTTP
的请求方式,返回结果为英文大写字母
str HttpRequest.method
POST
属性
HttpRequest
对象的POST
属性将返回django.http.request.QueryDict
的对象,包含HTTP POST
提交的数据,其语法结构为:
QueryDict HttpRequest.POST
GET
属性
HttpRequest
对象的GET
属性将返回django.http.request.QueryDict
的对象,包含HTTP GET
提交的数据,其语法结构为:
QueryDict HttpRequest.GET
具有浏览框的表单的限制
A.表单的提交方式只能为POST
B.必须设置表单的enctype="multipart/form-data"
属性
<form method="post" enctype="multipart/form-data">......
</form>
FILES
属性
FILES
属性返回django.utils.datastructures.MultiValueDict
对象
对于上传的文件超过2.5MB
将返回TemporaryUploadedFile
对象,否则返回InMemoryUploadedFile
对象,它们都继承自UploadedFile
对象,而UploadedFile
继承自File
对象,所以可以访问File
对象的name
、size
等属性
3.2 QueryDict
对象
QueryDict
对象继承自django.utils.datastructures.MultlValuDict
对象,MultiValue
对象的方法有:
get()
用于获取指定key
的值,否则返回default
MultiValue.get(key,default=None)
getlist()
用于获取指定key
的值,否则返回default
list MultiValue.getlist(key,default=None)
keys()
返回由键名组成的列表
list MultiValue.keys()
values()
返回由键值组成的列表
list MultiValue.value()
items()
dict()
返回由键名和键值组成的字典
dict MultiValue.dict()
unit04
一、HTTP
响应
每一个视图函数必须存在一个响应对象。
render()
函数返回是HttpResponse
对象,它的基本原理是将传递的模板文件与字典数据进进行混合后返回一个字符串的结果,该结果带入到HttpResponse
对象的参数中。
HttpReponse
对象位于django.http
模板内
from django.http import HttpResponse
其构造函数的结构为:
HttpResponse(content,content_type='text/html')
其中
content
代表的是响应的字符串信息
content_type
代表的响应的类型,默认为text/html
常用的响应类型有
响应类型 | 说明 |
---|---|
text/plain | 文本 |
text/html | HTML |
text/css | CSS |
text/javascript 、application/javascript | JS |
application/json | JSON |
JsonResponse
对象
JsonResponse
对象继承自HttpResponse
对象,其作用是返回JSON
响应,语法结构为:
#默认情况下,只能为字典对象转换为JSON格式的字符串
#对于非字典数据(列表数据)必须将safe参数设置为False
JsonResponse(data,safe=True)
二、模型
2.1 概述
模型 (Model
)是Django
为了构建和操纵数据库而提供的抽象层。
模型用于表示和操纵数据表及其记录。
所以首先通过MySQL
客户端创建数据库,如:
CREATE DATABASE IF NOT EXISTS knowbase;SHOW DATABASES;
2.2 配置
DATABASES = {'default': {# 数据库引擎的类型'ENGINE': 'django.db.backends.mysql',# MySQL数据库服务器的地址'HOST':'127.0.0.1',# MySQL数据库服务器的端口号'PORT':3306,# MySQL数据库服务器用户的用户名'USER':'root',# MySQL数据库服务器用户的密码'PASSWORD':'123456',# MySQL数据库服务器的数据库名称'NAME': 'knowbase',}
}
2.3 创建模型
模型需要在模块下的models.py
文件中进行定义,所有的模型都必须继承自django.db.models.Model
类,结构如下:
class ClassName(models.Model):field_name = models.数据类型([选项[,...]])......
2.4 数据类型
数据类型 | 描述 |
---|---|
CharField(max_length=长度) | VARCHAR |
SmallIntegerField() | SMALLINT |
PositiveSmallIntegerField() | SMALLINT UNSIGNED |
IntegerField() | INT |
PositiveIntegerField() | INT UNSIGNED |
BigIntegerField() | BIGINT |
PositiveBigIntegerField() | BIGINT UNSIGNED |
BooleanField | TINYINT(1) |
FloatField(max_digits=数字总长度,decimal_places=小数点后的数字长度) | FLOAT(M,D) |
DecimalField(max_digits=数字总长度,decimal_places=小数点后的数字长度) ) | DOUBLE(M,D) |
TextField() | LONGTEXT |
DateField() | DATE |
TimeField() | TIME |
DateTimeField(auto_now_add=是否自动记录创建时间,auto_now=是否自动记录修改时间) | DATETIME |
2.5 数据迁移
第一步:生成移迁文件
$ python3 manage.py makemigrations
第二步:数据迁移
$ python3 manage.py migrate
add
过滤器用于进行字符串的拼接,如{{ username|add:'ABC'}} <!--假定username变量的值为Tom,那么拼接完的结果为 TomABC -->
三、管理器
在Django
的模型中要实现数据表中记录的管理是通过管理器来实现的
Django
为每个模型提供了一个名称为objects
的管理器,它作为模型的属性进行访问
模型类.objects
如:
from .models import Bookprint(type(Book.objects))
all()
方法
all()
方法用于返回管理器的全部对象,其语法结构为:
QuerySet Manager.all()
get()
方法
get()
方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常
Object Manager.get(condition[,....])
如果以主键字段进行查找的话,可以写为
Book.objects.get(id=5) # 或者 Book.objects.get(pk=5)
四、QuerySet
QuerySet
称为查询集或者查询结果集,用于表示与管理器相关查询结果。
Queryset
可以进行切片、复制及过滤等操作
all()
方法
all()
方法用于返回结果集中的全部对象,其语法结构为:
QuerySet QuerySet.all()
get()
get()
方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常
Object QuerySet.get(condition[,...])
filter()
filter()
方法用于根据指定的条件对结果集进行过滤,返回一个新的结果集
QuerySet QuerySet.filter(字段名称__查询谓语=值[,...])
first()
first()
方法用于返回结果集中的第一条记录
object QuerySet.first()
last()
last()
方法用于返回结果集中的最后一条记录
object QuerySet.last()
order_by()
order_by()
方法用于对结果集进行排序
QuerySet QuerySet.order_by('字段名称'[,....])
降序排列时,字段名称的写法为-字段名称
查询谓语
exact
,相等(区分大小写),可以在使用时直接用=
进行操作iexact
,相等,不区分大小写gt
,大于gte
,大于等于lt
,小于lte
,小于等于in
,在指定值内,字段名称__in=(value,value,vlaue,..)
range
,区间范围同,字段名称__range=(min,max)
contains
,包含指定的字符,区分大小写icontains
,包含指定的字符,不区分大小写startswith
,以指定字符开头,区分大小写istartswith
,以指定字符开头,不区分大小写endswith
,以指定字符结尾,区分大小写iendwith
,以指定字符结尾,不区分大小写
F
函数
from django.db.models import F
在查询时使用到某表内的字段时,必须通过F
函数将其引用
Book.objects.filter(sale_price__gte=200+F('cost_price'))
unit05
一、模型
values()
values()
方法用于限制返回的字段,可迭代对象为字典
QuerySet QuerySet.values(*fields)
结果样式如:
<QuerySet [{'id': 1}, {'id': 2}]>
values_list()
values_list()
方法用于限制返回的字段,可迭代对象为元组
QuerySet QuerySet.values_list(*fields)
结果样式如:
<QuerySet [(1,), (2,)]>
only()
only()
方法用于限制返回的字段,可迭代对象为模型实例
QuerySet QuerySet.only(*fields)
结果样式如:
<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>
query
query
属性返回当前查询结果集对应的SQL
语句
str QuerySet.query
Q
函数
Q
函数用于对查询表达式进行连接,然后进行逻辑运算
from django.db.models import Q
exclude()
exclude()
方法返回不符合指定条件的记录
Queryset QuerySet.exclude(条件表达式)
count()
count()
方法用于获取结果集包含的记录总数
int QuerySet.count()
aggregate()
聚合函数有Count
、Max
、Min
、Sum
和Avg,
位于
from django.db.models import Count,Sum,Avg,Max,Min
dict QuerySet.aggregate(key=Count('field_name'))
dict QuerySet.aggregate(key=Max('field_name'))
dict QuerySet.aggregate(key=Min('field_name'))
dict QuerySet.aggregate(key=Sum('field_name'))
dict QuerySet.aggregate(key=Avg('field_name'))
annotate
aggregate()
方法用于对整个Queryset
进行聚合操作,而annotate()
方法用于对特定的字段进行聚合
Queryset QuerySet.annotate(key=Count('field_name'))
Queryset QuerySet.annotate(key=Max('field_name'))
Queryset QuerySet.annotate(key=Min('field_name'))
Queryset QuerySet.annotate(key=Sum('field_name'))
Queryset QuerySet.annotate(key=Avg('field_name'))
unit 06
一、HttpRequest
对象
path
属性
path
属性用于获取请求URL
str HttpRequest.path
get_full_path()
方法
get_full_path()
方法用于获取请求URL
及查询字符串
str HttpRequest.get_full_path()
redirect()
函数
redirect()
函数用于跳转到其他URL
from django.shortcuts import redirectredirect(to)
相关文章:
【Python】从0开始的Django基础
Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…...
红黑树(数据结构篇)
数据结构之红黑树 红黑树(RB-tree) 概念: 红黑树是AVL树的变种,它是每一个节点或者着成红色,或者着成黑色的一棵二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间,它的插入操作使用的是非递归形式实现红黑树的高度最多是…...
高级视频编码器性能对比(H265、VP9、AV1)
1、背景介绍 目前在视频编解码器中,H264已经成为绝对的主流,被大部分设备、浏览器所支持。虽然有更先进的编码器推出,但是受限于推广速度和设备支持成本,一直未能成为主流。 今年公司目标是持续降本增效,现在将”屠刀…...
示例:WPF中DataGrid简单设置合并列头
一、目的:应用DataGridTemplateColumn列模板,去拆分列头和单元格布局的方式设置列头合并样式 二、实现 效果如下 三、环境 VS2022 四、示例 应用DataGridTemplateColumn自定义列头信息和单元格信息 <DataGrid AutoGenerateColumns"False"…...
Matlab图像处理——细胞图像的分割和计数显示
一. 项目介绍 使用MATLAB编写的细胞图像分割及计数系统,实现了对图像内细胞的计数,以及对每个细胞周长和面积的测量,并分别展示了分割后的每个细胞的图像。实验步骤共分为图像预处理、图像预分割、空洞填充、黏连细胞分割、细胞个数统计、细胞…...
六爻排盘神机
选修课留了3000字的论文......确实,削微有那么一点小困难…… 但是,倘若我拿出已经占了6419个字符的 “六爻排盘神机” ,阁下…应该…不会…骂我吧 且看,六爻排盘神机! import random import datetime from lunarcale…...
【ARMv8/v9 GIC 系列 2.1 -- GIC SPI 中断的 pending 和 clear pending 配置】
文章目录 GIC Pending 和 Clear PendingGICD_ISPENDR<n>GICD_ICPENDR<n>参数<n>编号解释使用举例设置中断ID 100为挂起状态清除中断ID 100的挂起状态 代码实现小结 GIC Pending 和 Clear Pending 在ARMv8体系结构中,GICD_ISPENDR<n> 和 GI…...
SpringBoot集成logback初始化源码解析(部分)
一.SpringBoot配置扩展点 SpringBoot日志模块使用监听的方式进行初始化,在SpringBoot项目启动后,会通知日志监听器 在日志监听器中ApplicationStartingEvent事件用来确定到底使用哪个日志系统,logback log4j等 在日志监听器中ApplicationEn…...
【Linux工具】yum软件包管理器与Vim编辑器的高效运用
目录 Linux 软件包管理器 YUM 什么是软件包 安装工具 rzsz 及注意事项 查看软件包 安装和卸载软件 安装软件 卸载软件 Linux 开发工具 编辑器 - Vim 使用 编辑 Vim 与 Vi 的区别 Vim 的基本概念 三种模式 Vim 的基本操作 操作尝试: Vim 命令集解释…...
Matlab数学建模实战应用:案例4 - 图像处理
目录 前言 一、图像处理基础 二、Matlab图像处理工具箱 三、案例:图像锐化、去噪和分割 步骤 1:读取和显示图像 步骤 2:图像锐化 步骤 3:图像去噪 步骤 4:图像分割 完整代码示例 四、实际应用 实例总结 总…...
Studying-代码随想录训练营day15| 222.完全二叉树的节点个数、110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和
第十五天,二叉树part03💪,编程语言:C 目录 257.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和 总结 257.完全二叉树的节点个数 文档讲解:代码随想录完全二叉树的节点个数 视频讲解…...
Python 基础:异常
目录 一、异常概念二、处理异常2.1 抛出异常2.2 使用 try-except 代码块2.3 使用 try-except-else 代码块2.4 静默失败 三、总结 遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步! 本文参考:《Python编程&a…...
XML 应用程序
XML 应用程序 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它是一种自我描述的语言,允许用户定义自己的标签和文档结构。XML广泛应用于各种应用程序中,包括网站开发、数据交换、文档管理等。本文将探讨XML的一些主要…...
SprringCloud Gateway动态添加路由不重启
文章目录 前言:一、动态路由必要性二、SpringCloud Gateway路由加载过程RouteDefinitionLocator接口PropertiesRouteDefinitionLocator类DiscoveryClientRouteDefinitionLocatorInMemoryRouteDefinitionRepositoryCompositeRouteDefinitionLocator类CachingRouteDef…...
Windows安装mysql
首先去官网下载社区版本的mysql(如果连不上,挂梯子) https://www.mysql.com/downloads/ 2. 去配置环境变量path 3. 在cmd里面初始化数据库(在搜索框输入cmd,或者在资源管理器下搜索烂输入cmd回车就行) my…...
chatgpt: linux 下用纯c 编写ui
在Linux下用纯C语言编写用户界面(UI),通常会使用GTK或Xlib。GTK是一个更高级的库,提供了丰富的控件和功能,而Xlib则是一个更底层的库,提供了直接操作X Window系统的功能。 下面是一个使用GTK在Linux上创建…...
Java十六进制Dump打印数据
代码 package test;import java.io.IOException;import sun.misc.HexDumpEncoder;@SuppressWarnings("restriction")...
某棋牌渗透测试
前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、信息收集 这里通过fofa进行收集,语法为:body某棋牌 && titlexxx 图1-1 fofa资产收集 …...
JAVA面试(六)
缓存 MemcachedredisRedis常见数据类型和使用Redis缓存持久化RDB-快照AOF-追加文件 Redis数据过期机制惰性删除定期删除Redis缓存淘汰策略(8种)算法LRU (Least Recently Used):最近最少使用LFU(Least Frequ…...
【C语言】手写学生管理系统丨附源码+教程
最近感觉大家好多在忙C语言课设~ 我来贡献一下,如果对你有帮助的话谢谢大家的点赞收藏喔! 1. 项目分析 小白的神级项目,99%的程序员,都做过这个项目! 掌握这个项目,就基本掌握 C 语言了! 跳…...
流媒体传输协议HTTP-FLV、WebSocket-FLV、HTTP-TS 和 WebSocket-TS的详细介绍、应用场景及对比
一、前言 HTTP-FLV、WS-FLV、HTTP-TS 和 WS-TS 是针对 FLV 和 TS 格式视频流的不同传输方式。它们通过不同的协议实现视频流的传输,以满足不同的应用场景和需求。接下来我们对这些流媒体传输协议进行剖析。 二、传输协议 1、HTTP-FLV 介绍:基于 HTTP…...
【机器学习】线性回归:从基础到实践的深度解析
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 线性回归:从基础到实践的深度解析引言一、线性回归基础1.1 定义与目…...
短视频开源项目MoneyPrinterTurbo:AI副业搞起来,视频制作更轻松!
目录 引言一、MoneyPrinterTurbo简介二、MoneyPrinterTurbo的核心功能三、MoneyPrinterTurbo的未来发展四、MoneyPrinterTurbo与AI副业五、部署实践1、克隆代码2、创建虚拟环境3、安装依赖4、安装好 ImageMagick5、端口映射6、启动Web界面7、模型配置8、填写主题9、视频生成10、…...
【JAVA】SpringBoot + skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上
【JAVA】SpringBoot skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上 1.下载SkyWalking APM https://skywalking.apache.org/downloads/ jdk8 不支持 SkyWalking APM 9.3.0以上版本,所以这里我们下载 9.3.0版本 2.下载 Java Agent …...
[xmake]构建静态库和动态库
xmake 静态库和动态库 在xmake中创建静态库和动态库的方法非常相似。以下是创建静态库和动态库的基本步骤: 创建xmake工程文件(xmake.lua)。 配置工程属性,包括工程名、版本等。 添加源代码文件到工程中。 设置是创建静态库还…...
功能测试 之 单模块测试----轮播图、登录、注册
单功能怎么测? 需求分析 拆解测试点 编写用例 1.轮播图 (1)需求分析 位置:后台--页面--广告管理---广告列表(搜索index页面增加广告位2) 操作完成后需要点击admin---更新缓存,前台页面刷新生效 (2)拆解…...
MyBatis-PageHelper 源码解说
归档 GitHub: MyBatis-PageHelper-源码解说 总说明 源码仓库: https://github.com/pagehelper/Mybatis-PageHelper克隆:git clone https://github.com/pagehelper/Mybatis-PageHelper.git切分支(tag):git checkout m…...
基于uni-app和图鸟UI的智慧校园圈子小程序开发实践
摘要: 随着教育信息化和“互联网教育”的快速发展,智慧校园建设已成为推动校园管理现代化、提高教育教学质量的重要手段。本文介绍了基于uni-app和图鸟UI开发的智慧校园圈子小程序,旨在通过一站式服务、个性化定制、数据互通和安全可靠等特点…...
STM32 keil工程移植到Visual Studio Code环境中编译
1、GCC Vscode 搭建 STM32 开发环境 GCC Vscode 搭建 STM32 开发环境(一)- 环境部署 - 知乎 (zhihu.com) 2、在原有keil工程下找到原本CUBEMX生成的.ioc工程文件 3、将.ioc文件复制一个新的文件夹下双击打开工程,将IDE选为Makefile&…...
细说CountDownLatch
CountDownLatch是Java中提供的一个同步辅助类,它允许一个或多个线程等待其他线程完成操作。在面试中,面试官经常会询问候选人是否在实际项目中使用过CountDownLatch,以评估其对多线程编程和并发控制的理解和经验。本文将详细介绍CountDownLat…...
wordpress数据库操作/免费建立个人网站
三阶魔方-第三层场景分析1主色在哪一边?【定义】 一、现状 第3层未完成。 背面颜色全部到位。 其他3面的颜色,只有中间位置的错位。二、目标 其他3面,归位。三、主色指的是 第3层中间的颜色 面向自己的那一面的中心的颜色。四、主色在左边 第…...
简单网站建设优化/株洲seo优化哪家好
一般来说,做过SEO的站长,在网站初期都会发外链,给网站做链接优化,主要有两个好处:提升网站的权重和提升网站关键词排名。这两点提高了,不仅更有助于被网友访问到,提高网站知名度,还会…...
珠海网站推广公司/深圳网站优化
方法1 - 系统命令sudo su - postgres #切换到postgres用户(系统用户)createdb weichen #创建数据库psql #直接訪问数据库(默认进入本地postgres数据库)\l --查看数据库列表:q --退出列表页面\q --退出clientdropdb weichen #删除数据库方法2 - psql命令行sudo -u postgres psql…...
免费微网站怎么做/软文怎么写
【1】故障模拟准备环境这里以innodb为例【1.1】配置参数开启独立表空间 innodb_file_per_table;【1.2】构建测试数据create database test;create table a(id int,num int);insert into a values(1,11),(2,12);【2】故障模拟【2.1】在业务正在运行的情况下,手动删除…...
重庆营销型网站开发价格/企业网站设计价格
分支结构: ① 单分支结构: 非常简单,if 条件语句,如果为true 则输出结果。否则不输出结果 ② 二分支结构: 条件结果为true则执行语句1,否则就执行语句2 If <条件>: <语句1> Else : …...
丹阳市网站制作/网站建设工作总结
2020年转瞬即逝,好像从去年直接过渡到了今年年尾。马上就快真正的毕业三年了,突然觉得三年很短暂,以前总是觉得三年这么久的时间肯定能做很多事情。 还在学校的时候和同学感慨:为什么人越长大越会觉得时间过得快而且能记住的东西…...