【Python】从0开始的Django基础

Django框架基础

unit01

一、Django基础

1.1 什么是Django?

Django是一个基于Python语言的、开源的、重量级的WEB开发框架。

Django适用于开发各类WEB应用程序,包括但不限于电商网站、博客等。

Django的官网:http://www.djangoproject.com

1.2 安装与卸载

1.2.1 PythonDjango的版本

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 安装

shell 复制代码
$ pip3 install django[==version]

1.2.3 查看Django版本

shell 复制代码
$ python3 -m django --version
shell 复制代码
$ django-admin --version

1.2.4 卸载

shell 复制代码
$ pip3 uninstall django

二、Django项目

2.1 概述

Django项目由一个或多个应用程序(指模块)组成,在每个模块中有相对独立的路由、视图、模型、模板等。

2.2 创建项目

shell 复制代码
$ django-admin startproject projectname

2.3 启动项目

第一步:在命令行输入以下命令:

shell 复制代码
$ python3 manage.py runserver [[address:]port]

如:

shell 复制代码
$ 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 项目的目录结构

tex 复制代码
djangoBasic/,项目根目录
├── db.sqlite3,默认的sqlite3数据库文件
├── djangoBasic,内层目录 -- 包
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py,项目配置文件
│   ├── urls.py,根路由文件
│   └── wsgi.py
└── manage.py,入口文件

2.5 配置

python 复制代码
# 项目的根目录
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)中定义路由

python 复制代码
path(router,view)

URL地址为字母、数字、下划线、短横线的组合

如:

python 复制代码
path('hello/',????)

第二步:定义(视图)函数

python 复制代码
def function_name(request):
    ...
    ...

如:

python 复制代码
def hello(request):
    print('Hello Django')

相对完整的示例代码如下:

python 复制代码
# 函数
def hello(request):
    print('Hello,Django')

# 路由
urlpatterns = [
    # ....
    #代表的是当通过 http://127.0.0.1:8000/hello/访问时,将调用hello函数
	path('hello/',hello),
]

运行结果如下:

此时产生错误的原因是:(视图)函数没有返回响应对象

Django.http包中提供了HttpResponse类,它用于完成Http响应,所以:

python 复制代码
from django.http import HttpResponse
# 函数
def hello(request):
    return HttpResponse('Hello,Django')

此时的运行结果如下:

第三步:通过链接或表单的action来访问相关的路由

此时产生了另外的两个问题:

第一:如果来访问http://127.0.0.1:8000时将产生404 错误 -- 怎么解决?

第二:现在在urls.py中既有路由又有视图函数 -- 不便于管理 -- 如何便捷管理?

3.2 定义首页的路由

python 复制代码
path('',视图函数)

示例代码

python 复制代码
from django.http import HttpResponse

def index(request):
    return HttpResponse('Index Page')

urlpatterns = [
    # 首页路由
	path('',index),
]    

3.3 便捷管理路由及视图函数

为了便于管理视图函数,强烈建议将视图函数存储到views.py中,然后再在urls.py中引用该模块即可

urls.py的示例代码如下:

python 复制代码
from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
    path('hello/', views.hello),
]

views.py的示例代码如下:

python 复制代码
from django.http import HttpResponse


def hello(request):
    return HttpResponse('Hello Django')


def index(request):
    return HttpResponse('Index Page')

对于静态的路由可以直接按需要进行定义,但是对于动态的路由,如访问某一个文章时的ID,此时如何定义?

3.4 路径转换器

路径转换器主要解决动态路由的问题,如:

tex 复制代码
http://127.0.0.1:8000/user/<id>

路径转换器的基本语法:

python 复制代码
path("<类型:参数名称>/<类型:参数名称>",视图函数)

需要注意的是:在定义视图函数时,如果路由中存在路径转换器,那么视图函数也必须存在相同名称的参数

3.4.1 int

int类型的路径转换器自动匹配正整数,类型为int,如:

python 复制代码
path("users/<int:id>",views.userinfo),

userinfo的函数代码示例如下:

python 复制代码
def userinfo(request,id):
    ...
    ....

3.4.2 str

str类型的路径转换器自动匹配字符串,/除外,类型为str,如:

python 复制代码
path("topic/<str:topic>/",views.topic),

3.4.3 slug

slug匹配任意由字母、数字、短横线与下划线组成的字符,其类型为str,如:

python 复制代码
path('blog/<slug:title>',views.blog),

3.4.4 uuid

UUID的格式为8-4-4-4-12的十六位进制数字组成,其类型为uuid

Pythonuuid模块

python 复制代码
import uuid

# 基于当前服务器ID和时间
uuid.uuid1()
# 基于随机数
uuid.uuid4()

3.4.5 path

path 匹配路径,包括/

python 复制代码
path('download/<path:path>/',views.download),

组合使用的案例

python 复制代码
path('carts/<str:username>/id/<int:id>/',views.carts),

path('<str:username>/<int:id>/',views.goods),

四、模块

每个Django项目至少存在一个模块(应用程序)

4.1 创建模块

shell 复制代码
$ python3 manage.py startapp app_name

如:

shell 复制代码
$ python3 manage.py startapp users

$ python3 manage.py startapp goods

4.2 注册模块

将创建的模块名称添加到配置文件的INSTALLED_APPS列表中,如:

python 复制代码
INSTALLED_APPS = [
    # ...
    'goods',
    'users',
]

4.3 分布式路由

所谓的分布式路由是将某个模块下以共同字符串开头的路由写在根路由文件中,不同的部分写在模块内部的urls.py中,当访问时系统将自动把两个部分的URL进行拼接。

include()函数位于django.urls模块内,其作用是将当前路由与指定包含文件的路由进行拼接

python 复制代码
include("URLS文件")
python 复制代码
# urls.py最简陋的样子
from django.urls import path
from . import views

urlpatterns = [
	path('',views.index),
]
python 复制代码
# views.py最简陋的样子
def index(request):
    ...
    ...

unit02

一、DTL

1.1 什么是DTL?

DTL(Django Templates Language)Django模板语言,实际上就是将HTML页面与程序代码进行混合的技术。

1.2 模板配置

python 复制代码
#模板配置
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模板内:

python 复制代码
from django.shortcuts import render

render()函数的语法结构为:

python 复制代码
render(request,template_name,context=None)

request代表的HttpRequest 对象

template_name指要渲染的模板文件路径及名称

context指要传递到模板的数据,其类型必须为dict

二、DTL

模板文件内可以使用:注释、变量、标签等

2.1 变量

html 复制代码
# 变量
{{ variable_name }}
# 列表或元组
{{ variable_name.index }}
# 字典
{{ variable_name.key }}
#对象属性
{{ variable_name.property }}
#对象方法
{{ varible_name.method s}}

2.2 标签

标签是指模板中进行逻辑控制的代码,如分支结构、循环结构等,标签的基本语法结构为:

html 复制代码
{% 标签名称 %}


或者

{% 开始标签名称 %}
...
...
{% 结束标签名称%}

2.2.1 for标签

html 复制代码
{% for variable in iterable %}
 ...
 ...
{% endfor %}
html 复制代码
{% 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标签

html 复制代码
{% 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

html 复制代码
{% csrf_token %}

在以post方式提交的表单内必须在使用{% csrf_token %} 产生令牌

当在表单内添加{% csrf_token %}标签后将产生个名称为csrfmiddlewaretoken的隐藏域

html 复制代码
<input type="hidden" name="csrfmiddlewaretoken" value="7erwqas">

2.2.5 静态资源

静态资源是网站用于布局的样式文件、图片文件及脚本文件。

2.2.5.1 静态资源的配置
python 复制代码
# 静态文件的路由
STATIC_URL = '/static/'

# 静态文件的位置 
STATICFILES_DIRS = [
    BASE_DIR / 'static'
]
2.2.5.2 访问静态资源

第一步:通过{% load static %}标签加载static标签

html 复制代码
{% load static %}

第二步:在模板文件中通过static标签来访问静态资源

html 复制代码
{% static '静态文件的的路径及名称' %}

被静态文件引用的文件(如在CSS文件内引用图片),因为该静态文件没有经过模板引擎处理,所以不能使用{% static %}标签来加载 -- 只能通过其相对路径实现

unit03

一、DTL

1.1 标签

include标签

include标签用于在一个模板文件中包含另外一个模板文件,语法结构为:

html 复制代码
{% include '被包含的模板文件的位置及名称' with variable=value variable=value %}

cycle标签

当每次遇到cycle标签时都会产生一个值,第一次产生第一个值,第二个产生第二值,依次类推。当值用尽时,再次遇到该标签时,就产生第一个值。

html 复制代码
{% cycle 'value1' 'value2' 'value3' ... %}

注释

{# 这是一个单行注释 #}

{% comment %}
	第一行
    第二行
{% endcomment%}

1.2 过滤器

过滤器用于转换变量或标签参数的值,其基本语法结构为:

html 复制代码
{{ 变量名称|过滤器:参数:参数 }}

safe

当通过变量向模板文件传递HTML内容时,在模板中将把HTML内容中的特殊符号进行替换操作,如>替换为&gt;<替换为&lt;

之所以进行替换的原因是为了防止XSS(Cross-site scripting)攻击(译为跨站脚本攻击)。举例说明:

假设在某个网站中对于某条新闻发表了评论,内容如下:

txt 复制代码
这篇新闻很好
<script>
while(true){
    window.alert("哈哈哈");
}
</script>

当用户发表该评论后,其内容将写入到服务器的数据库 --- 不会产生任何问题

但是,如果该评论被某个用户通过浏览器进行访问时,那么其中的

txt 复制代码
<script>
while(true){
    window.alert("哈哈哈");
}
</script>

将被浏览器认为是JavaScript脚本 - - 并且为死循环!!!

如何解决 -- 将输入的><等替换为对于HTML实体,如果此时再有用户输入以下评论:

html 复制代码
这篇新闻很好
<script>
while(true){
    window.alert("哈哈哈");
}
</script>

将输入的><等替换为对于HTML实体的结果为:

html 复制代码
这篇新闻很好

&lt;script&gt;
while(true){
    window.alert(&quot;哈哈哈&quot;);
}
&lt;/script&gt;

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对象作为视图函数的第一个参数

python 复制代码
# 当前request参数代表的就是HttpRequest对象
def function_name(request):
    ...
    ...

HttpRequest对象存在的属性除非另有说明外都是只读属性

3.1 属性

method属性

method属性用于获取HTTP的请求方式,返回结果为英文大写字母

python 复制代码
str HttpRequest.method

POST属性

HttpRequest 对象的POST 属性将返回django.http.request.QueryDict的对象,包含HTTP POST提交的数据,其语法结构为:

python 复制代码
QueryDict HttpRequest.POST

GET属性

HttpRequest 对象的GET属性将返回django.http.request.QueryDict的对象,包含HTTP GET提交的数据,其语法结构为:

python 复制代码
QueryDict HttpRequest.GET

具有浏览框的表单的限制

A.表单的提交方式只能为POST

B.必须设置表单的enctype="multipart/form-data"属性

html 复制代码
<form method="post" enctype="multipart/form-data">
    ...
    ...
</form>

FILES属性

FILES属性返回django.utils.datastructures.MultiValueDict对象

对于上传的文件超过2.5MB 将返回TemporaryUploadedFile对象,否则返回InMemoryUploadedFile对象,它们都继承自UploadedFile对象,而UploadedFile继承自File对象,所以可以访问File对象的namesize等属性

3.2 QueryDict对象

QueryDict对象继承自django.utils.datastructures.MultlValuDict对象,MultiValue对象的方法有:

get()用于获取指定key的值,否则返回default

python 复制代码
MultiValue.get(key,default=None)

getlist()用于获取指定key的值,否则返回default

python 复制代码
list MultiValue.getlist(key,default=None)

keys()返回由键名组成的列表

python 复制代码
list MultiValue.keys()

values()返回由键值组成的列表

python 复制代码
list MultiValue.value()

items()

dict()返回由键名和键值组成的字典

python 复制代码
dict MultiValue.dict()

unit04

一、HTTP响应

每一个视图函数必须存在一个响应对象。

render()函数返回是HttpResponse对象,它的基本原理是将传递的模板文件与字典数据进进行混合后返回一个字符串的结果,该结果带入到HttpResponse对象的参数中。

HttpReponse对象位于django.http模板内

python 复制代码
from django.http import HttpResponse

其构造函数的结构为:

python 复制代码
HttpResponse(content,content_type='text/html')

其中

content 代表的是响应的字符串信息

content_type 代表的响应的类型,默认为text/html

常用的响应类型有

响应类型 说明
text/plain 文本
text/html HTML
text/css CSS
text/javascriptapplication/javascript JS
application/json JSON

JsonResponse对象

JsonResponse 对象继承自HttpResponse对象,其作用是返回JSON响应,语法结构为:

python 复制代码
#默认情况下,只能为字典对象转换为JSON格式的字符串
#对于非字典数据(列表数据)必须将safe参数设置为False
JsonResponse(data,safe=True)

二、模型

2.1 概述

模型 (Model)是Django为了构建和操纵数据库而提供的抽象层。

模型用于表示和操纵数据表及其记录。

所以首先通过MySQL客户端创建数据库,如:

mysql 复制代码
CREATE DATABASE IF NOT EXISTS knowbase;

SHOW DATABASES;

2.2 配置

python 复制代码
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类,结构如下:

python 复制代码
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 数据迁移

第一步:生成移迁文件

shell 复制代码
$ python3 manage.py makemigrations

第二步:数据迁移

shell 复制代码
$ python3 manage.py migrate

add过滤器用于进行字符串的拼接,如

html 复制代码
{{ username|add:'ABC'}}
<!--假定username变量的值为Tom,那么拼接完的结果为 TomABC -->

三、管理器

Django的模型中要实现数据表中记录的管理是通过管理器来实现的

Django为每个模型提供了一个名称为objects的管理器,它作为模型的属性进行访问

python 复制代码
模型类.objects

如:

python 复制代码
from .models import Book

print(type(Book.objects))

all()方法

all()方法用于返回管理器的全部对象,其语法结构为:

python 复制代码
QuerySet Manager.all()

get()方法

get()方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常

python 复制代码
Object Manager.get(condition[,....])

如果以主键字段进行查找的话,可以写为

python 复制代码
Book.objects.get(id=5)
# 或者
Book.objects.get(pk=5)

四、QuerySet

QuerySet称为查询集或者查询结果集,用于表示与管理器相关查询结果。

Queryset可以进行切片、复制及过滤等操作

all()方法

all()方法用于返回结果集中的全部对象,其语法结构为:

python 复制代码
QuerySet QuerySet.all()

get()

get()方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常

python 复制代码
Object QuerySet.get(condition[,...])

filter()

filter()方法用于根据指定的条件对结果集进行过滤,返回一个新的结果集

python 复制代码
QuerySet QuerySet.filter(字段名称__查询谓语=值[,...])

first()

first()方法用于返回结果集中的第一条记录

python 复制代码
object QuerySet.first()

last()

last()方法用于返回结果集中的最后一条记录

python 复制代码
object QuerySet.last()

order_by()

order_by()方法用于对结果集进行排序

python 复制代码
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函数

python 复制代码
from django.db.models import F

在查询时使用到某表内的字段时,必须通过F函数将其引用

python 复制代码
Book.objects.filter(sale_price__gte=200+F('cost_price'))

unit05

一、模型

values()

values()方法用于限制返回的字段,可迭代对象为字典

python 复制代码
QuerySet QuerySet.values(*fields)

结果样式如:

python 复制代码
<QuerySet [{'id': 1}, {'id': 2}]>

values_list()

values_list()方法用于限制返回的字段,可迭代对象为元组

python 复制代码
QuerySet QuerySet.values_list(*fields)

结果样式如:

python 复制代码
<QuerySet [(1,), (2,)]>

only()

only()方法用于限制返回的字段,可迭代对象为模型实例

python 复制代码
QuerySet QuerySet.only(*fields)

结果样式如:

python 复制代码
<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>

query

query属性返回当前查询结果集对应的SQL语句

python 复制代码
str QuerySet.query

Q函数

Q函数用于对查询表达式进行连接,然后进行逻辑运算

python 复制代码
from django.db.models import Q

exclude()

exclude()方法返回不符合指定条件的记录

python 复制代码
Queryset QuerySet.exclude(条件表达式)

count()

count()方法用于获取结果集包含的记录总数

python 复制代码
int QuerySet.count()

aggregate()

聚合函数有CountMaxMinSumAvg,位于

python 复制代码
from django.db.models import Count,Sum,Avg,Max,Min
python 复制代码
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()方法用于对特定的字段进行聚合

python 复制代码
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

python 复制代码
str HttpRequest.path

get_full_path()方法

get_full_path()方法用于获取请求URL及查询字符串

python 复制代码
str HttpRequest.get_full_path()

redirect() 函数

redirect()函数用于跳转到其他URL

python 复制代码
from django.shortcuts import redirect

redirect(to)
相关推荐
EterNity_TiMe_3 分钟前
【机器学习】智驭未来:探索机器学习在食品生产中的革新之路
人工智能·python·机器学习·性能优化·学习方法
Mopes__41 分钟前
Python | Leetcode Python题解之第452题用最少数量的箭引爆气球
python·leetcode·题解
AI视觉网奇1 小时前
pymeshlab 学习笔记
开发语言·python
纪伊路上盛名在1 小时前
如何初步部署自己的服务器,达到生信分析的及格线
linux·运维·服务器·python·学习·r语言·github
计算机源码社1 小时前
分享一个餐饮连锁店点餐系统 餐馆食材采购系统Java、python、php三个版本(源码、调试、LW、开题、PPT)
java·python·php·毕业设计项目·计算机课程设计·计算机毕业设计源码·计算机毕业设计选题
汤兰月1 小时前
Python中的观察者模式:从基础到实战
开发语言·python·观察者模式
西柚与蓝莓3 小时前
【开源开放体系总结】
python
belldeep6 小时前
python:reportlab 将多个图片合并成一个PDF文件
python·pdf·reportlab
FreakStudio9 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
丶21369 小时前
【CUDA】【PyTorch】安装 PyTorch 与 CUDA 11.7 的详细步骤
人工智能·pytorch·python