Python中Web开发-Django框架
大家好,本文将带领大家进入 Django 的世界,探索其强大的功能和灵活的开发模式。我们将从基础概念开始,逐步深入,了解 Django 如何帮助开发人员快速构建现代化的 Web 应用,并探讨一些最佳实践和高级技术。无论是初学者还是有经验的开发人员,希望都能从本文中收获实用的知识和技能,提升在 Web 开发领域的能力和竞争力。
关于Flask和FastAPI,可以参考:
Python中Web开发-Flask框架
Python中Web开发-FastAPI框架
一、介绍
在当今的软件开发领域,Python 以其简洁、易读且功能强大的特性而备受推崇。作为一种高级编程语言,Python 在各个领域都有着广泛的应用,其中包括 Web 开发。其简洁的语法和丰富的库使得开发人员能够快速构建复杂的 Web 应用,而不必担心低级细节。
Python 的流行程度得益于其开放源代码的特性以及庞大而活跃的社区支持。开发人员可以轻松地共享代码、解决问题,并从他人的经验中汲取灵感。同时,Python 也是一种易学易用的语言,适合各个级别的开发者,从初学者到专家。
Django 简介
Django 是一个高级的 Python Web 框架,由开发人员 Adrian Holovaty 和 Simon Willison 在 2003 年创建。最初,他们为了满足新闻出版业务的需求而开发了 Django,后来它被开源,成为一个广泛应用于 Web 开发的框架。
Django 的设计理念包括高效性、可重用性和可扩展性。它提供了一整套工具和库,用于快速构建安全、灵活且功能丰富的 Web 应用。Django 的核心组件包括 URL 路由、模板引擎、表单处理、数据库管理等,这些组件为开发人员提供了开箱即用的解决方案,极大地提高了开发效率。
在 Web 开发中,Django 扮演着重要的角色。许多知名的网站和应用程序,如 Instagram、Pinterest 和 Disqus,都是基于 Django 构建的。其稳定性、安全性和可扩展性使得 Django 成为了许多开发团队首选的框架之一。
Django 特点
Django 作为一个流行的 Web 框架,具有许多独特的特点,让开发人员能够更轻松、高效地构建强大的 Web 应用。以下是 Django 的一些主要特点:
-
全功能的框架:Django 提供了一整套工具和库,涵盖了 Web 开发的各个方面,包括 URL 路由、模板引擎、表单处理、数据库管理、身份验证等。开发人员无需从头开始构建这些功能,而是可以直接使用 Django 提供的现成解决方案,极大地提高了开发效率。
-
优雅的 URL 设计:Django 的 URL 路由系统使得 URL 设计变得简单而优雅。通过简洁的 URL 映射规则,开发人员可以轻松地定义 URL 结构,并将请求分发到相应的视图函数进行处理。
-
强大的模板引擎:Django 的模板引擎使得在 Web 应用中渲染 HTML 页面变得简单而灵活。开发人员可以使用模板语言轻松地插入动态内容、控制流程和继承模板,从而构建出具有丰富交互性和可复用性的页面。
-
内置的管理后台:Django 提供了一个强大的管理后台,让开发人员可以轻松地管理 Web 应用中的数据。通过简单的配置,开发人员可以自动生成管理界面,包括数据的增删改查操作,而无需编写额外的代码。
-
ORM(对象关系映射)支持:Django 的 ORM 层提供了一种将 Python 对象映射到数据库表的简单而高效的方式。开发人员可以通过定义模型类来描述数据结构,而无需直接操作 SQL,从而简化了数据访问和管理的过程。
-
自动化的安全机制:Django 自带了许多安全机制,帮助开发人员有效地防止常见的 Web 安全漏洞,如跨站脚本攻击(XSS)、SQL 注入等。例如,Django 的表单处理机制自动防止 CSRF(跨站请求伪造)攻击,而内置的用户身份验证系统可以轻松处理用户认证和授权。
-
可扩展性和可定制性:Django 的组件化设计使得它具有很高的可扩展性和可定制性。开发人员可以通过使用第三方应用和插件来扩展 Django 的功能,或者通过修改现有组件来定制符合自己需求的解决方案。
综上所述,Django 以其全面的功能、简洁的设计和强大的性能而成为了许多开发团队首选的 Web 框架之一。无论是构建小型网站还是大型 Web 应用,Django 都能够满足开发人员的需求,并帮助他们快速、高效地实现自己的创意。
二、安装与配置
在这一部分,将详细介绍如何安装 Django 并进行基本的项目配置。
1、安装 Django
首先,我们需要通过 pip 工具来安装 Django。pip 是 Python 的包管理工具,可以方便地安装和管理 Python 包。
pip install django
上述命令会自动从 Python Package Index(PyPI)下载并安装最新版本的 Django。安装完成后,我们就可以在命令行中使用 Django 的各种工具和命令了。
2、创建项目
接下来,我们可以使用 Django 的命令行工具 django-admin
来创建一个新的 Django 项目。
在命令行中执行以下命令:
django-admin startproject myproject
这会在当前目录下创建一个名为 myproject
的新目录,其中包含了一个 Django 项目的基本结构。
进入到该目录中,你会看到以下文件和目录:
myproject/manage.pymyproject/__init__.pysettings.pyurls.pyasgi.pywsgi.py
其中,manage.py
是 Django 的命令行工具,用于执行各种管理命令;myproject
目录是项目的 Python 包,包含了项目的各个模块和配置文件。
3、配置项目
接下来,我们需要对项目进行一些基本的配置。打开 myproject/settings.py
文件,这是 Django 项目的主要配置文件。可以配置数据库、静态文件、模板等各种设置。
例如,我们可以设置数据库引擎、数据库名称、用户名、密码等数据库相关的配置:
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',}
}
我们使用 SQLite3 作为默认的数据库引擎,并指定了数据库文件的路径。
此外,我们还可以配置静态文件和模板文件的查找路径:
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / "static",
]TEMPLATES = [{...'DIRS': [BASE_DIR / 'templates'],...},
]
我们将静态文件放置在 myproject/static
目录下,并将模板文件放置在 myproject/templates
目录下。
三、创建应用程序
1、应用程序结构
在 Django 中,应用程序是一个具有特定功能的独立模块,通常包括模型、视图、模板等组件。一个标准的 Django 应用程序通常具有以下结构:
-
模型(Models):模型用于定义数据结构和数据库表的映射关系。每个模型类对应数据库中的一个表,模型类的属性对应表的字段。通过模型,我们可以轻松地进行数据库操作,如增删改查等。
-
视图(Views):视图负责处理用户请求并生成相应的响应。在 Django 中,视图通常是一个 Python 函数,接受 HTTP 请求作为参数,并返回 HTTP 响应。视图可以从数据库中获取数据,渲染模板,并将渲染结果返回给用户。
-
模板(Templates):模板用于定义 HTML 页面的结构和样式。模板中可以包含动态内容和模板标签,用于显示从视图传递过来的数据。Django 的模板引擎提供了丰富的语法和功能,使得模板的编写变得简单而灵活。
-
静态文件(Static Files):静态文件包括 CSS、JavaScript、图片等资源文件,用于页面的样式和交互效果。在 Django 中,我们可以将静态文件放置在指定的目录中,并通过模板引擎来引用和加载这些静态文件。
2、创建应用程序
要创建一个新的 Django 应用程序,我们可以使用 Django 的命令行工具 manage.py
。
在命令行中执行以下命令:
python manage.py startapp myapp
上述命令会在当前项目中创建一个名为 myapp
的新应用程序。进入到 myapp
目录中,会看到以下文件和目录:
myapp/__init__.pyadmin.pyapps.pymodels.pytests.pyviews.py
其中,models.py
文件用于定义应用程序的模型,views.py
文件用于定义视图函数,urls.py
文件用于配置 URL 路由等。
3、编写视图和模板
一旦创建了应用程序,我们就可以开始编写视图和模板来实现页面的渲染和数据展示。首先,我们需要在 views.py
文件中定义视图函数。
例如,我们可以编写一个简单的视图函数来渲染一个 HTML 页面:
# myapp/views.pyfrom django.shortcuts import render
from django.http import HttpResponsedef index(request):return HttpResponse("Hello, world!")
接下来,我们需要创建一个模板文件来定义页面的结构和样式。在 myapp
目录下创建一个名为 index.html
的模板文件,编写页面的 HTML 内容:
<!-- myapp/templates/index.html --><!DOCTYPE html>
<html>
<head><title>Hello, world!</title>
</head>
<body><h1>Hello, world!</h1>
</body>
</html>
最后,我们需要在 urls.py
文件中配置 URL 路由,将视图函数和 URL 路径进行关联。例如,我们可以添加以下路由配置:
# myapp/urls.pyfrom django.urls import path
from . import viewsurlpatterns = [path('', views.index, name='index'),
]
通过以上步骤,我们完成了一个简单的 Django 应用程序的创建和配置。现在,当用户访问应用程序的根 URL 时,将会看到 "Hello, world!" 的页面内容。
四、模型与数据库
1、模型定义
在 Django 中,模型用于定义数据结构和数据库表的映射关系。我们可以通过定义 Python 类来创建模型,类的属性对应数据库表的字段。
以下是一个简单的示例,展示了如何定义一个模型类:
# myapp/models.pyfrom django.db import modelsclass Product(models.Model):name = models.CharField(max_length=100)price = models.DecimalField(max_digits=10, decimal_places=2)description = models.TextField()
在上述示例中,我们定义了一个名为 Product
的模型类,包含了 name
、price
和 description
三个字段。name
字段是一个字符型字段,price
字段是一个十进制数字段,description
字段是一个文本字段。
2、数据库迁移
当我们定义了新的模型或修改了现有模型时,需要使用 Django 的迁移工具来同步数据库结构的变更。我们可以通过以下步骤进行数据库迁移:
首先,我们需要生成迁移文件,该文件包含了我们对模型的更改。
在命令行中执行以下命令:
python manage.py makemigrations myapp
然后,我们需要应用迁移文件,将更改应用到数据库中。在命令行中执行以下命令:
python manage.py migrate
3、数据库操作
一旦数据库迁移完成,我们就可以使用 Django 的 ORM(对象关系映射)进行数据库操作了。ORM 提供了一种将 Python 对象映射到数据库表的简单而高效的方式,使得数据库操作变得简单而直观。
以下是一些常见的数据库操作示例:
(1)创建新记录
product = Product.objects.create(name='Laptop', price=999.99, description='A powerful laptop.')
(2)查询记录
products = Product.objects.all()
(3)过滤记录
cheap_products = Product.objects.filter(price__lt=500)
(4)更新记录
product = Product.objects.get(name='Laptop')
product.price = 899.99
product.save()
(5)删除记录
product = Product.objects.get(name='Laptop')
product.delete()
通过以上操作,我们可以方便地对数据库进行增删改查等操作,而无需编写复杂的 SQL 语句。
五、路由与视图
1、URL 配置
URL 配置用于将请求路由到相应的视图函数或类视图。我们可以通过在项目的 URL 配置文件中定义 URL 路由来实现这一功能。
以下是一个简单的示例,展示了如何配置 URL 路由:
# myproject/urls.pyfrom django.urls import path
from myapp import viewsurlpatterns = [path('', views.index, name='index'), # 空路径映射到名为 index 的视图函数path('products/', views.product_list, name='product_list'), # /products/ 路径映射到名为 product_list 的视图函数path('products/<int:pk>/', views.product_detail, name='product_detail'), # /products/<id>/ 路径映射到名为 product_detail 的视图函数
]
2、视图函数
视图函数是处理 HTTP 请求并生成 HTTP 响应的函数。在 Django 中,视图函数通常接收一个 HttpRequest 对象作为参数,并返回一个 HttpResponse 对象作为响应。
以下是一个简单的示例,展示了如何编写一个视图函数:
# myapp/views.pyfrom django.http import HttpResponsedef index(request):return HttpResponse("欢迎访问我们的网站!")def product_list(request):# 从数据库中获取产品列表的逻辑products = [...] # 从数据库获取产品列表return render(request, 'product_list.html', {'products': products})def product_detail(request, pk):# 从数据库中获取产品详细信息的逻辑product = [...] # 从数据库获取产品详细信息return render(request, 'product_detail.html', {'product': product})
3、类视图
除了函数视图外,Django 还支持基于类的视图,称为类视图。类视图提供了一种更加面向对象的视图编写方式,使得视图逻辑更加清晰和可复用。
以下是一个简单的示例,展示了如何编写一个类视图:
# myapp/views.pyfrom django.views import View
from django.http import HttpResponseclass IndexView(View):def get(self, request):return HttpResponse("欢迎访问我们的网站!")class ProductListView(View):def get(self, request):# 从数据库中获取产品列表的逻辑products = [...] # 从数据库获取产品列表return render(request, 'product_list.html', {'products': products})class ProductDetailView(View):def get(self, request, pk):# 从数据库中获取产品详细信息的逻辑product = [...] # 从数据库获取产品详细信息return render(request, 'product_detail.html', {'product': product})
六、模板
在 Django 中,模板是用于生成 HTML 内容的文件,它包含了页面的结构、样式和动态内容。在这一部分,我们将详细介绍 Django 模板的语法和功能,包括模板语法、模板继承等。
1、模板语法
Django 模板语言(Template Language)是一种简单而强大的语法,用于在模板中插入动态内容、控制流程和展示逻辑。
以下是 Django 模板语言的基本语法和功能:
(1)变量
在 Django 模板中,可以使用双花括号 {{ }}
来输出变量的值。变量可以是视图函数中传递给模板的数据,也可以是模板中定义的变量。
例如:
<p>{{ username }}</p>
上述代码将会输出视图函数中传递给模板的 username
变量的值。
(2)标签
Django 模板语言提供了一系列标签来执行逻辑操作,如条件判断、循环等。标签使用 {% %}
包裹,例如 {% if %}
、{% for %}
等。
例如:
{% if user.is_authenticated %}<p>Welcome back, {{ user.username }}!</p>
{% else %}<p>Please log in.</p>
{% endif %}
(3)过滤器
过滤器用于对变量进行处理或转换,在输出变量时使用管道符号 |
连接。例如,{{ variable|filter }}
。过滤器可以用于格式化文本、处理日期、字符串等。
例如:
<p>{{ text|lower }}</p>
上述代码将会将 text
变量的值转换为小写输出。
(4)注释
Django 模板语言支持使用 {# #}
进行注释。注释可以在模板中添加说明或标记,并不会在最终生成的 HTML 中显示。
例如:
{# This is a comment #}
(5)转义
默认情况下,Django 会自动转义模板中的 HTML 特殊字符,如 <
, >
, &
等,以防止 XSS 攻击。如果不希望进行转义,可以使用 {% autoescape off %}
标签来关闭自动转义。
2、模板继承
模板继承是一种重用模板代码并实现页面布局统一的有效方式。通过定义一个基础模板,并在其基础上扩展其他模板,我们可以实现页面的复用和布局的统一。
示例:
base.html 内容如下:
<!-- base.html --><!DOCTYPE html>
<html>
<head><title>{% block title %}My Website{% endblock %}</title>
</head>
<body><div class="header"><h1>Welcome to My Website</h1></div><div class="content">{% block content %}{% endblock %}</div><div class="footer"><p>© 2024 My Website</p></div>
</body>
</html>
product_detail.html 内容如下:
<!-- product_detail.html -->{% extends 'base.html' %}{% block title %}{{ product.name }} - My Website{% endblock %}{% block content %}<h2>{{ product.name }}</h2><p>Price: ${{ product.price }}</p><p>Description: {{ product.description }}</p>
{% endblock %}
在上述示例中,base.html
是基础模板,定义了网站的整体结构和布局;product_detail.html
继承了 base.html
,并在其基础上定义了具体页面的内容。通过模板继承,我们可以实现页面的复用和布局的统一,同时也能够实现代码的可维护性和可扩展性。
七、表单处理
1、表单定义
在Django中,表单类是用于处理用户输入数据验证和处理的工具。通过定义表单类,你可以轻松地在网站中创建表单,然后验证用户的输入,并在需要时对输入数据进行处理。
要定义一个Django表单类,需要创建一个继承自django.forms.Form
的类,并在其中定义表单字段以及相应的验证规则。
以下是一个简单的示例:
from django import formsclass MyForm(forms.Form):name = forms.CharField(max_length=100)email = forms.EmailField()message = forms.CharField(widget=forms.Textarea)
在这个示例中,我们定义了一个名为MyForm
的表单类,其中包含了三个字段:name
、email
和message
。CharField
用于文本输入,EmailField
用于验证电子邮件格式,Textarea
用于多行文本输入。
2、表单展示
要在模板中展示表单,你首先需要在视图函数中实例化表单类,然后将其传递给模板。
以下是一个简单的视图函数示例:
from django.shortcuts import render
from .forms import MyFormdef my_view(request):if request.method == 'POST':form = MyForm(request.POST)if form.is_valid():# 处理有效的表单数据passelse:form = MyForm()return render(request, 'my_template.html', {'form': form})
在模板中,可以使用form
变量来渲染表单。例如:
<form method="post">{% csrf_token %}{{ form.as_p }}<button type="submit">提交</button>
</form>
这将在模板中展示一个包含所有表单字段的表单,并使用<p>
标签包裹每个字段。
3、表单验证
Django提供了强大的表单验证机制,它会自动检查用户提交的数据是否符合预期的格式和规则。当你调用表单对象的is_valid()
方法时,Django会自动运行验证规则,并返回一个布尔值,指示提交的数据是否有效。
如果数据有效,可以通过表单对象的cleaned_data
属性来获取经过清洗的数据,然后进行进一步的处理。如果数据无效,is_valid()
方法会自动将错误信息存储在表单对象的errors
属性中,可以在模板中使用这些错误信息来向用户显示错误提示。
if form.is_valid():# 处理有效的表单数据cleaned_data = form.cleaned_data# 对数据进行进一步处理
else:# 处理无效的表单数据errors = form.errors# 在模板中显示错误信息
八、用户认证与授权
在Web应用程序中,用户认证和授权是至关重要的功能。Django提供了内置的用户认证和权限系统,使得实现用户注册、登录、注销以及权限控制变得非常简单。
1、用户认证
(1)用户注册
Django内置的认证系统提供了一个内置的用户模型User
,你可以使用它来实现用户注册功能。通常,需要创建一个注册表单,并在视图中处理用户提交的注册请求,最后保存新用户到数据库中。
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render, redirectdef register(request):if request.method == 'POST':form = UserCreationForm(request.POST)if form.is_valid():form.save()return redirect('login') # 注册成功后重定向到登录页面else:form = UserCreationForm()return render(request, 'registration/register.html', {'form': form})
(2)用户登录
用户登录需要一个登录表单和对应的视图处理函数。在登录成功后,Django会创建一个用户会话,使用户保持登录状态。
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login as auth_login
from django.shortcuts import render, redirectdef login(request):if request.method == 'POST':form = AuthenticationForm(request, request.POST)if form.is_valid():auth_login(request, form.get_user())return redirect('home') # 登录成功后重定向到主页else:form = AuthenticationForm()return render(request, 'registration/login.html', {'form': form})
(3)用户注销
用户注销简单地销毁当前用户会话。
from django.contrib.auth import logout as auth_logout
from django.shortcuts import redirectdef logout(request):auth_logout(request)return redirect('home') # 注销后重定向到主页
2、权限控制
(1)创建用户组
Django的权限系统允许创建用户组,将一组权限分配给该组,并将用户添加到组中。
from django.contrib.auth.models import Group# 创建一个用户组
group = Group.objects.create(name='编辑人员')# 将权限分配给用户组
group.permissions.add(permission1, permission2, ...)
(2)分配权限给用户
可以将权限直接分配给单个用户,或者将用户添加到具有特定权限的用户组中。
from django.contrib.auth.models import User, Permission# 获取用户
user = User.objects.get(username='john')# 分配权限给用户
user.user_permissions.add(permission1, permission2, ...)# 或者将用户添加到用户组
user.groups.add(group)
(3)检查用户权限
在视图函数中,可以使用装饰器或者在代码中进行权限检查,确保只有具有特定权限的用户能够访问或执行某些操作。
from django.contrib.auth.decorators import login_required, permission_required
from django.shortcuts import render@login_required
def my_view(request):# 只有登录用户才能访问此视图return render(request, 'my_template.html')@permission_required('app_name.permission_name', raise_exception=True)
def restricted_view(request):# 只有具有特定权限的用户才能访问此视图return render(request, 'restricted_template.html')
九、管理后台
Django的管理后台是一个内置的功能,提供了一个便捷的方式来管理网站的数据和用户。管理员可以使用管理后台来执行各种操作,如创建、编辑、删除数据库中的模型实例,管理用户和组,查看日志等。
1、后台管理
(1)启用管理后台
要启用管理后台,首先需要在settings.py
文件中注册需要管理的模型。
# settings.pyINSTALLED_APPS = [...'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',...
]
(2)创建管理员账号
在终端中运行以下命令以创建超级用户账号。
python manage.py createsuperuser
然后按照提示输入用户名、电子邮件地址和密码。
(3)访问管理后台
启动开发服务器后,你可以在浏览器中访问/admin
路径来进入管理后台,并使用刚刚创建的超级用户账号登录。
2、自定义管理界面
(1)自定义显示模型
可以在模型的Admin
类中自定义模型在管理后台中的显示方式。
# admin.pyfrom django.contrib import admin
from .models import MyModelclass MyModelAdmin(admin.ModelAdmin):list_display = ('field1', 'field2', 'field3')search_fields = ('field1', 'field2')admin.site.register(MyModel, MyModelAdmin)
在上面的示例中,我们自定义了MyModel
在管理后台中的显示方式,指定了要在列表中显示的字段以及可以进行搜索的字段。
(2)自定义管理操作
可以在模型的Admin
类中定义自定义的管理操作,以执行特定的任务。
# admin.pyfrom django.contrib import admin
from .models import MyModelclass MyModelAdmin(admin.ModelAdmin):actions = ['custom_action']def custom_action(self, request, queryset):# 执行自定义操作passadmin.site.register(MyModel, MyModelAdmin)
在上面的示例中,我们定义了一个名为custom_action
的自定义操作,可以在管理后台中对选定的模型实例执行特定的任务。
(3)自定义管理界面
还可以通过创建自定义的管理界面模板来自定义管理后台的外观和功能。
<!-- admin/myapp/mymodel/change_list.html -->{% extends "admin/change_list.html" %}{% block content %}<div class="custom-content"><!-- 自定义内容 --></div>{{ block.super }}
{% endblock %}
在这个示例中,我们创建了一个自定义的模型列表页面模板,并添加了一些自定义的内容。
十、部署与优化
1、部署选项
在选择部署Django应用程序的选项时,你可以考虑以下几种常见的方式:
-
本地部署: 将Django应用程序部署在本地开发机器或者局域网中的服务器上。这种部署方式适合开发和测试阶段,但通常不适用于生产环境。
-
云平台部署: 使用云计算平台(如AWS、Google Cloud、Azure等)来部署Django应用程序。云平台提供了强大的基础设施和服务,可以简化部署和管理过程,并提供高可用性和可伸缩性。
-
自托管服务器: 在自己的服务器上自行部署Django应用程序。你可以选择自行搭建服务器,或者使用托管提供商(如DigitalOcean、Linode等)来租用服务器进行部署。
下面是一个示例,演示如何在本地使用Django自带的开发服务器进行部署:
# 切换到项目目录
cd /path/to/your/django/project# 启动Django开发服务器
python manage.py runserver
2、生产环境准备
在将Django应用程序部署到生产环境之前,需要进行一些准备工作,以确保应用程序的性能和稳定性,并提供一定的安全性。
以下是一些准备步骤:
-
选择合适的数据库: 在生产环境中选择适合的数据库来存储应用程序的数据。常见的选择包括MySQL、PostgreSQL、SQLite和MongoDB等。
-
配置Web服务器: 选择合适的Web服务器来托管Django应用程序。常见的选择包括Nginx和Apache。通常,可以使用这些Web服务器作为反向代理,将请求转发给Django应用程序运行的WSGI服务器(如uWSGI、Gunicorn等)。
-
处理静态文件和媒体文件: 在生产环境中,需要考虑如何处理静态文件和媒体文件。通常,可以使用Nginx或者CDN来提供静态文件,而媒体文件可以存储在对象存储服务(如AWS S3、Google Cloud Storage等)中。
-
配置安全性选项: 在生产环境中配置好安全性选项,包括使用HTTPS来加密传输数据、配置正确的CORS策略、防止跨站请求伪造(CSRF)、防止SQL注入和XSS攻击等。
-
性能优化: 对Django应用程序进行性能优化是非常重要的。可以使用缓存来加速页面加载速度,优化数据库查询和模型设计,使用异步任务来处理耗时的操作,以及对代码进行优化以提高执行效率。
-
监控和日志记录: 在生产环境中设置监控和日志记录是保证应用程序稳定性的重要步骤。可以使用工具来监控服务器负载、响应时间和错误率,并设置适当的日志记录级别来追踪和排查问题。
下面是一个示例,演示如何在生产环境中使用Nginx和uWSGI来托管Django应用程序:
# nginx配置文件(/etc/nginx/nginx.conf)server {listen 80;server_name example.com;location / {include uwsgi_params;uwsgi_pass unix:/path/to/your/django/project/project.sock;}location /static {alias /path/to/your/django/project/static;}location /media {alias /path/to/your/django/project/media;}
}
# 启动uWSGI服务器
uwsgi --socket /path/to/your/django/project/project.sock --module your_project.wsgi --chmod-socket=666
通过以上准备工作,可以将Django应用程序成功地部署到生产环境中,并进行相应的优化和配置,以确保应用程序的性能、稳定性和安全性。
十一、进阶
1、Django扩展
Django扩展是一些第三方库,提供了额外的功能和工具,可以帮助开发者更高效地构建Django应用程序。
以下是一些常用的Django扩展:
(1)Django REST framework
Django REST Framework(简称DRF)是一个在Django框架之上构建的强大灵活的工具包,用于构建基于RESTful架构的Web API。它提供了一系列功能和工具,使得构建和管理Web API变得更加简单和高效。
主要特性:
-
序列化器(Serializers): DRF提供了强大的序列化器,用于在Django模型和JSON之间进行数据转换。你可以使用序列化器来定义API的输入和输出格式,并进行数据验证和转换。
-
视图(Views): DRF提供了一系列视图类,用于处理API的请求和响应。它包括基于类的视图(Class-based views)和基于函数的视图(Function-based views),可以根据需求选择合适的视图类。
-
路由(Routers): DRF提供了路由器(Routers)来自动生成URL路由,简化了URL配置的过程。你可以使用路由器来自动映射视图和URL,提高开发效率。
-
认证(Authentication): DRF支持多种认证方式,包括基于Token的认证、Session认证、OAuth认证等。你可以根据需求选择合适的认证方式来保护API的安全性。
-
权限(Permissions): DRF提供了一系列权限类,用于控制用户对API资源的访问权限。你可以根据需求选择合适的权限类来限制用户的访问。
-
过滤器(Filters): DRF提供了一系列过滤器类,用于对查询集进行过滤和排序。你可以使用过滤器来处理API的查询参数,实现数据过滤和搜索功能。
示例:
安装:
pip install djangorestframework
定义序列化器:
from rest_framework import serializers
from .models import MyModelclass MyModelSerializer(serializers.ModelSerializer):class Meta:model = MyModelfields = '__all__'
定义视图:
from rest_framework import viewsets
from .models import MyModel
from .serializers import MyModelSerializerclass MyModelViewSet(viewsets.ModelViewSet):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
配置路由:
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import MyModelViewSetrouter = DefaultRouter()
router.register(r'mymodels', MyModelViewSet)urlpatterns = [path('', include(router.urls)),
]
(2)Django ORM Toolkit
Django ORM Toolkit 是一个用于扩展和增强 Django 的 ORM(对象关系映射)功能的工具包。它提供了一组工具和库,帮助开发者更轻松地处理数据库操作,并提供了一些额外的功能,如数据库迁移、查询优化等。
主要特性:
-
数据库迁移(Database Migrations): Django ORM Toolkit 提供了数据库迁移工具,可以帮助开发者管理数据库模式变更。你可以使用迁移工具来创建、应用和撤销数据库迁移,保持数据库模式与应用程序模型的同步。
-
QuerySet API: Django ORM Toolkit 扩展了 Django 的 QuerySet API,提供了一系列额外的方法和功能,用于构建和执行数据库查询。你可以使用 QuerySet API 来过滤、排序、聚合和操作数据库中的数据。
-
数据库路由(Database Routing): Django ORM Toolkit 允许你配置多个数据库,并指定每个模型在哪个数据库中进行操作。这对于构建多租户应用程序或者分布式数据库系统非常有用。
-
自定义数据库字段(Custom Database Fields): Django ORM Toolkit 允许你定义自定义的数据库字段,以扩展和定制 Django 的 ORM 功能。你可以定义自定义字段来处理特殊的数据类型或者实现特定的业务逻辑。
-
查询优化(Query Optimization): Django ORM Toolkit 提供了一系列优化技巧和建议,帮助开发者优化数据库查询的性能。这包括使用索引、减少查询次数、避免 N+1 查询问题等。
-
原生SQL查询(Raw SQL Queries): Django ORM Toolkit 允许你执行原生的 SQL 查询,以满足一些特殊的需求。你可以直接执行原生的 SQL 语句,并将结果转换为 Django 模型或者字典对象。
示例:
安装:
pip install django-extensions
数据库迁移:
# 创建迁移文件
python manage.py makemigrations# 应用迁移
python manage.py migrate# 撤销迁移
python manage.py migrate your_app_name zero
QuerySet API:
from django.db.models import Q
from .models import MyModel# 过滤查询
queryset = MyModel.objects.filter(name__startswith='A')# 排序查询
queryset = MyModel.objects.order_by('created_at')# 聚合查询
total_count = MyModel.objects.count()# 复杂查询
queryset = MyModel.objects.filter(Q(name__icontains='search') | Q(description__icontains='search'))
自定义数据库字段:
from django.db import modelsclass EncryptedTextField(models.TextField):# 实现加密逻辑passclass MyModel(models.Model):encrypted_data = EncryptedTextField()
查询优化:
# 使用索引
class MyModel(models.Model):name = models.CharField(max_length=100, db_index=True)
原生SQL查询:
from django.db import connectiondef my_custom_sql():with connection.cursor() as cursor:cursor.execute("SELECT * FROM myapp_mymodel WHERE id = %s", [1])row = cursor.fetchone()return row
通过以上示例,可以看到 Django ORM Toolkit 如何帮助开发者更轻松地处理数据库操作,并提供了一些额外的功能,如数据库迁移、查询优化等。 Django ORM Toolkit 的丰富功能和易用性使得在 Django 中操作数据库变得更加简单和高效。
(3)Django Celery
Django Celery 是一个用于处理异步任务的分布式任务队列,它可以帮助开发者将耗时的操作转移到后台异步执行,从而提高应用程序的并发处理能力和响应速度。Django Celery 是基于 Celery 和 Django 框架的集成,提供了一套方便易用的接口,可以在 Django 应用程序中轻松地使用 Celery 来处理异步任务。
主要特性:
-
分布式任务队列: Django Celery 提供了一个分布式任务队列,可以将任务分发到多个工作者节点上并行执行。这可以帮助开发者处理大量的任务,提高应用程序的并发处理能力。
-
后台异步执行: Django Celery 允许开发者将耗时的操作转移到后台异步执行,从而避免阻塞主线程,提高应用程序的响应速度和用户体验。
-
定时任务调度: Django Celery 支持定时任务调度,可以周期性地执行任务或者在特定的时间点执行任务。你可以使用 Celery 的定时任务调度功能来执行一些周期性的操作,如数据备份、邮件发送等。
-
任务结果存储: Django Celery 提供了任务结果存储功能,可以将任务的执行结果保存到数据库、缓存或者其他后端存储中。这可以帮助开发者跟踪任务的执行状态和结果,进行错误处理和调试。
-
监控和管理: Django Celery 提供了监控和管理工具,可以帮助开发者监控任务队列的运行状态、查看任务执行日志、管理任务队列等。这可以帮助开发者及时发现和解决问题,保证任务队列的稳定性和可靠性。
示例:
安装 Celery:
pip install celery
定义异步任务:
# tasks.pyfrom celery import shared_task@shared_task
def my_async_task(param):# 执行耗时操作pass
调用异步任务:
# views.pyfrom .tasks import my_async_taskdef my_view(request):if request.method == 'POST':param = request.POST.get('param')my_async_task.delay(param)return HttpResponse('Task submitted successfully')return render(request, 'my_template.html')
启动 Celery 工作者节点:
celery -A your_project_name worker --loglevel=info
启动 Celery 定时任务调度:
celery -A your_project_name beat --loglevel=info
(4)Django Channels
Django Channels 是一个用于处理实时 Web 应用程序的扩展,它支持 WebSocket 和其他协议,可以帮助开发者构建实时聊天应用程序、在线游戏等功能。传统的 HTTP 请求-响应模式是无法实现实时通信的,而 WebSocket 协议可以在客户端和服务器之间建立持久的双向连接,实现实时通信。Django Channels 将 WebSocket 和其他协议集成到 Django 框架中,使得在 Django 应用程序中实现实时通信变得更加简单和高效。
主要特性:
-
支持 WebSocket 和其他协议: Django Channels 支持 WebSocket、HTTP/2 和其他协议,可以灵活地处理不同类型的实时通信需求。
-
异步处理: Django Channels 使用异步处理模型,可以处理大量的并发连接,并且不会阻塞主线程,保证应用程序的响应速度。
-
通道和消费者: Django Channels 提供了通道(Channels)和消费者(Consumers)的概念,用于处理客户端和服务器之间的消息传递。你可以定义消费者来处理特定类型的消息,并将其与通道进行绑定。
-
群组和广播: Django Channels 支持群组(Groups)和广播(Broadcasting),可以将多个客户端组织成群组,并向群组中的所有客户端发送消息。
-
内置协议支持: Django Channels 内置了一些常用的协议支持,如聊天协议、RPC 协议等,可以帮助开发者更快速地构建实时应用程序。
-
集成性好: Django Channels 可以与 Django 框架无缝集成,你可以在 Django 应用程序中使用 Django Channels 来处理实时通信,而无需改变现有的代码架构。
示例:
安装 Django Channels:
pip install channels
定义消费者:
# consumers.pyfrom channels.generic.websocket import WebsocketConsumerclass MyConsumer(WebsocketConsumer):def connect(self):self.accept()def disconnect(self, close_code):passdef receive(self, text_data):self.send(text_data=json.dumps({'message': text_data}))
配置路由:
# routing.pyfrom django.urls import path
from channels.routing import ProtocolTypeRouter, URLRouter
from myapp.consumers import MyConsumerwebsocket_urlpatterns = [path('ws/myapp/', MyConsumer.as_asgi()),
]application = ProtocolTypeRouter({'websocket': URLRouter(websocket_urlpatterns),
})
连接 WebSocket:
// 在客户端使用 WebSocket 连接
var ws = new WebSocket('ws://your_domain/ws/myapp/');ws.onmessage = function(event) {console.log('Received message:', event.data);
};ws.send('Hello, World!');
通过以上示例,可以看到如何在 Django 应用程序中使用 Django Channels 来处理 WebSocket 连接,并实现实时通信功能。
2、性能优化
优化Django应用程序的性能是确保用户体验的关键。以下是一些建议和技巧,帮助优化Django应用程序的性能:
-
使用缓存: 使用缓存来减少数据库查询和计算,加速页面加载速度。你可以使用Django的内置缓存系统,或者使用Memcached、Redis等外部缓存服务。
-
优化数据库查询: 使用合适的查询集和索引来优化数据库查询,减少查询时间和资源消耗。避免使用过多的查询和N+1查询问题。
-
使用异步任务: 使用异步任务来处理耗时的操作,如发送电子邮件、处理文件上传等,从而释放主线程,提高并发处理能力。
-
使用CDN: 使用内容分发网络(CDN)来加速静态文件的传输,减少页面加载时间。CDN可以将静态文件缓存到全球各地的服务器上,提供更快的访问速度。
-
使用Web服务器和应用服务器: 使用高性能的Web服务器和应用服务器来托管Django应用程序,如Nginx、uWSGI、Gunicorn等。
-
使用异步视图: 使用异步视图来处理I/O密集型操作,如调用外部API、访问数据库等,从而提高应用程序的并发处理能力。
示例:
# 使用缓存
from django.core.cache import cachedef my_view(request):data = cache.get('my_data')if not data:data = expensive_operation()cache.set('my_data', data, timeout=3600)return render(request, 'my_template.html', {'data': data})
# 使用异步任务
from .tasks import send_email_taskdef my_view(request):if request.method == 'POST':email = request.POST.get('email')send_email_task.delay(email)return HttpResponse('Email sent successfully')return render(request, 'my_template.html')
通过以上技巧和建议,可以优化Django应用程序的性能,提升用户体验,使应用程序更加稳定和高效。
十二、常见问题与调试
1、常见问题
-
数据库迁移错误: 初学者经常遇到数据库迁移时出现的各种错误,如模型字段定义错误、数据库连接问题等。解决方法包括检查模型定义、数据库配置和数据库状态等。
-
URL 配置错误: 初学者可能会在 URL 配置中出现错误,导致页面无法访问或者访问错误的页面。解决方法包括仔细检查 URL 配置、使用命名 URL 等。
-
模板渲染错误: 初学者可能会在模板渲染过程中出现错误,导致页面无法正确显示。解决方法包括检查模板语法、上下文变量传递等。
-
静态文件配置错误: 初学者可能会在配置静态文件时出现错误,导致页面无法加载静态文件。解决方法包括检查静态文件路径配置、使用 {% static %} 模板标签等。
-
性能问题: 初学者可能会在应用程序性能方面遇到问题,如页面加载速度慢、数据库查询过多等。解决方法包括优化数据库查询、使用缓存、减少页面资源等。
2、调试技巧
-
使用 print 调试: 在代码中使用 print 语句输出变量的值,以便了解程序执行过程中的数据变化。
-
使用日志记录: 在代码中使用 Python 的 logging 模块记录日志,以便跟踪程序执行过程中的错误和信息。
-
使用断点调试器: 在开发环境中使用断点调试器(如 PyCharm、VS Code 等)设置断点,以便逐行调试程序并查看变量值。
-
查看错误信息: 在遇到错误时,仔细阅读错误信息和堆栈跟踪,以便定位问题所在。
-
使用 Django Debug Toolbar: 在开发环境中安装并使用 Django Debug Toolbar,以便查看页面性能统计信息、数据库查询等。
-
使用 Django shell: 在 Django shell 中执行代码片段,以便快速测试和调试功能。
-
查看文档和社区: 在遇到问题时,查阅 Django 官方文档和社区论坛,寻求帮助和解决方案。
相关文章:
Python中Web开发-Django框架
大家好,本文将带领大家进入 Django 的世界,探索其强大的功能和灵活的开发模式。我们将从基础概念开始,逐步深入,了解 Django 如何帮助开发人员快速构建现代化的 Web 应用,并探讨一些最佳实践和高级技术。无论是初学者还…...
1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…...
LeetCode 两两交换链表中的节点
原题链接24. 两两交换链表中的节点 - 力扣(LeetCode) 思路,请看图片的过程模拟,这里添加了一个哨兵节点0,目的是为了方便操作,得到指向1节点的指针。 class Solution {public:ListNode* swapPairs(ListNod…...
STM32作业实现(五)温湿度传感器dht11
目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…...
java mybatis处理大数据量,开启和配置二级缓存,及注意事项,已解决
注意事项: 尽量避免使用下面方式写sql否则会降低服务器性能: mybatis二级缓存开启后,避免使用事务注解(加上事务注解后二级缓存数据会导致两次访问不一致问题): 3. 返回的对象实体类,要实现Se…...
在 LLM 架构中应用多专家模型
本文转载自:在 LLM 架构中应用多专家模型 2024年 3月 14日 By Kyle Kranen and Vinh Nguyen https://developer.nvidia.cn/zh-cn/blog/applying-mixture-of-experts-in-llm-architectures/ 文章目录 一、概述二、LLM 架构领域的专家齐聚一堂1、模型容量2、MoE 在降低…...
C语言编程代码软件:深入探索与实战应用
C语言编程代码软件:深入探索与实战应用 在编程的广袤领域中,C语言以其独特的魅力吸引着无数编程爱好者。作为一种基础且强大的编程语言,C语言在软件开发、系统编程、嵌入式系统等领域发挥着不可替代的作用。而要想熟练掌握C语言,…...
【AIGC半月报】AIGC大模型启元:2024.06(上)
AIGC大模型启元:2024.06(上) (1) ChatTTS(语音合成项目) (1) ChatTTS(语音合成项目) 2024.06.01 ChatTTS 文本转语音项目爆火出圈,引来大家极大的关注。短短三天时间,在…...
两款 IntelliJ IDEA 的 AI 编程插件
介绍两款 IntelliJ IDEA 的 AI 编程插件:通义灵码和 CodeGeeX。 通义灵码 这是由阿里推出的一个基于通义大模型的 AI 编码助手。 它提供了代码智能生成、研发智能问答等功能。通义灵码经过海量优秀开源代码数据训练,可以根据当前代码文件及跨文件的上下…...
语义化版本控制:软件工程的实用之道
语义化版本控制:软件工程的实用之道 在软件开发过程中,版本控制是确保项目稳定、有序进行的关键环节。随着项目的发展,功能的增加、错误的修复以及API的修改变得日益频繁。为了有效管理这些变化,并确保团队成员、用户以及依赖该软…...
Java设计模式总结
《武林外传》老白曾经说过这样一句话。高手就是手里无刀,心中也无刀。 类似于设计模式,你不知不觉中已经融进你的代码中了,但你并不知已经运用了。下面我总结几个我觉得比较常用的设计模式。 1:设计模式分类 总体来说设计模式分为…...
小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…...
HCIP-Datacom-ARST自选题库__EBGP【18道题】
一、单选题 1.在排除EBGP邻居关系故障时,你发现两台直连设备使用Loopback口建立连接,故执行display current-configurationconfiguration bgp查看peer ebgp-max-hop hop-count的配置,下列哪项说法是正确的? hop-count必须大于2 hop-count…...
TypeScript算法每日一题:两数之和(167)
作者:前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 题库:力扣 题目序号:167(简单) 题目: 给你一个下标从1开始的整数数组 numbers ,该数组已按非…...
用docker搭建的Vulfocus镜像管理界面没有镜像可以拉取解决办法
ps:截止到今天2023.4.2,kali和vps的docker拉取的vulfocus镜像会有版本的区别,虽然都是拉取的最新版,vps上镜像为3个月以前,kali上为16个月以前,所以在修改 views.py 文件时,可能会发现文件内容不…...
CSPM.pdf
PDF转图片 归档:...
多个短视频剪辑成一个视频:四川京之华锦信息技术公司
多个短视频剪辑成一个视频:创作中的艺术与技术 在数字时代,短视频以其短小精悍、内容丰富的特点,迅速成为社交媒体上的热门内容形式。然而,有时单一的短视频难以完全表达创作者的意图或满足观众的观赏需求。因此,将多…...
算法第三天力扣第69题:X的平方根
69. x 的平方根 (可点击下面链接或复制网址进行做题) https://leetcode.cn/problems/sqrtx/https://leetcode.cn/problems/sqrtx/ 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被…...
异常处理。
异常 是指程序运行中出现了错误。 捕获异常: 对bug进行提醒,使整个程序继续运行。 捕获所有异常: try:#可能出错的代码 except:如果出现异常执行的代码 可以输出异常的类型: try:a1bhuishprint(ab) except Exception as i:…...
MySQL—函数(介绍)—字符串函数(基础)
一、引言 提到函数,在SQL分类中DQL语句中有一个聚合函数,如COUNT()、SUM()、MAX()等等。这些都是一些常见的聚合函数,而聚合函数只是函数的一种,接下来会详细的学习和介绍一下函数的应用场景和以及 mysql 当中文件的函数有哪些。 …...
CTF本地靶场搭建——静态flag题型的创建
静态flag题型的创建 首先这里要说的是静态flag和动态flag。 在CTF(Capture The Flag)比赛中,静态flag的使用通常与特定的赛制或题目类型关联,而不是直接与题型绑定。静态flag意味着这些flag是预先设定好的,不会随比…...
基于Django的博客系统之用HayStack连接elasticsearch增加搜索功能(五)
上一篇:搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL(四) 下一篇:基于Django的博客系统之增加类别导航栏(六) 功能概述 添加搜索框用于搜索博客。 需求详细描述 1. 添加搜索框用于搜索博客 描…...
开源VS闭源:大模型发展路径之争,你站哪一派?
文章目录 引言一、数据隐私1.1开源大模型的数据隐私1.2 闭源大模型的数据隐私1.3 综合考量 二、商业应用2.1 开源大模型的商业应用2.2 闭源大模型的商业应用2.3 商业应用的综合考量 三、社区参与3.1 开源大模型的社区参与3.2 闭源大模型的社区参与3.3 综合考量 结论 引言 在人…...
Python | Leetcode Python题解之第115题不同的子序列
题目: 题解: class Solution:def numDistinct(self, s: str, t: str) -> int:m, n len(s), len(t)if m < n:return 0dp [[0] * (n 1) for _ in range(m 1)]for i in range(m 1):dp[i][n] 1for i in range(m - 1, -1, -1):for j in range(n …...
STM32高级控制定时器应用之检测输入PWM周期和占空比
目录 概述 1 PWM 输入模式 1.1 原理介绍 1.2 应用实例 1.3 示例时序图 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM占空比函数 3.2 输入捕捉回调函数 4 功能测试 4.1 测试软件框架结构 4.2 实验实现 4.2.1 测试实…...
[AI Google] 三种新方法利用 Gemini 提高 Google Workspace 的生产力
Workspace 侧边栏中的 Gemini 现在将使用 Gemini 1.5 Pro,新的 Gemini for Workspace 功能即将登陆 Gmail 移动应用,等等。 Gemini for Google Workspace 帮助个人和企业更好地利用 Google 应用——从在 Gmail 中撰写邮件到在 Sheets 中组织项目计划。过…...
【U-Net验证】逐元素乘积将特征投射到极高维隐式特征空间的能力
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需使用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言网络结构编码结构解码结构代码 实验实验设置w/o-ReLU的性能比较with-ReLU的性能比…...
快团团大团长帮卖如何导出单个团购的订单?免费教程教你怎么做!
一、小程序端如何导出单个团购的订单? 进入团购页面,在订单管理——订单导出中,点击订单数据表格,可导出到邮箱,或通过在浏览器中查看下载链接 二、电脑端如何导出单个团购的订单? 1、如何自定义选择订单信…...
services层和controller层
services层 我的理解,services层是编写逻辑代码语句最多的一个层,非常重要,在实际的项目中,负责调用Dao层中的mybatis,在我的项目中它调用的是这两个文件 举例代码如下 package com.example.sfdeliverysystem.servic…...
Pycharm编辑器下自定义模块导入报错:no module named问题
相信很多使用pycharm 社区版编写python 程序的初学者都会遇到这样一个看似简单但是一时半刻找不到解决头绪的问题: 在同个目录下导入自己编写的模块到主程序的过程中,直接import的时候会报错:ModuleNotFoundError。 通过各种方法尝试以后还是…...
C#使用GDI对一个矩形进行任意角度旋转
C#对一个矩形进行旋转GDI绘图,可以指定任意角度进行旋转 我们可以认为一张图片Image,本质就是一个矩形Rectangle,旋转矩形也就是旋转图片 在画图密封类 System.Drawing.Graphics中, 矩形旋转的两个关键方法 //设置旋转的中心点 public v…...
打印机的ip不同且连不上
打印机的ip不同且连不上 1.问题分析2.修改网段3.验证网络 1.问题分析 主要是打印机的网段和电脑不在同一个网段 2.修改网段 3.验证网络...
关于linux程序的查看、前台运行、后台运行、杀死的管理操作。
前言 在Linux中, 程序(program)是放在磁盘上的程序,是不会执行的。 进程(process)是程序被触发,从而加载到内存中的,会被CPU随机执行。 Linux中,有非常多的进程在实时运…...
STM32作业设计
目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…...
PHPSTOM配置Laradock,xdebug,phpunit
原理图: 片面理解: phpstorm启用一个9000端口,这个端口用来接收到信息后,启用xdebug功能。服务器端(docker), 当客户端访问laravel项目域名后, 并读取xdebug.ini的配置, 把调试的请求数据, 向配置里面的端口发送消息, 配置里面的端…...
使用Java进行数据分析和处理:应用在实际业务场景中的技术
在当今数据驱动的时代,数据分析和处理已经成为各行各业中不可或缺的一部分。Java作为一种广泛应用于企业级开发的编程语言,也在数据领域展现出了强大的能力。本文将探讨如何使用Java进行数据分析和处理,以及在实际业务场景中应用的技术。 ##…...
C++中的List
摘要 C 标准库中的 std::list 是一种双向链表容器,它允许在常数时间内进行插入和删除操作,每个元素包含一个指向前一个和后一个元素的指针。这给我们开发提供了高效的插入和删除操作。 引入头文件 要使用 std::list,需要包含头文件 <li…...
go map 如何比较两个 map 相等
go map 如何比较两个 map 相等 都为 nil非空、长度相等,指向同一个 map 实体对象相应的 key 指向的 value 相等 直接将使用 map1 map2 是错误的。这种写法只能比较 map 是否为 nil。因此只能是遍历map 的每个元素,比较元素是否都是深度相等。...
牛客网刷题 | BC108 反斜线形图案
目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 KiKi学习了循环&am…...
数据的表示和运算
目录 一.各进制间的相互转换 1.各进制转化为10进制 2.二进制和八进制,十六进制之间地相互转化 3.十进制转换为其他进制 二.BCD码(Binary-Coded Decimal,用二进制编码的十进制) 1.8421码 2.余3码 3.2421码 三.无符号整数 …...
【爬虫工具】油管视频批量采集软件
一、背景介绍 1.1 爬取目标 我用Python独立开发了一款爬虫软件,作用是:通过搜索关键词采集ytb的搜索结果,包含14个关键字段:关键词,页码,视频标题,视频id,视频链接,发布时间,视频时长,频道名称,频道id,频道链接,播放数,点赞数,评…...
【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名
【LeetCode刷题】Day 14 题目1:153.寻找旋转排序数组中的最小值思路分析:思路1:二分查找:以A为参照思路2:二分查找,以D为参照 题目2:LCR 173.点名思路分析:思路1:遍历查找…...
使用python绘制小提琴图
使用python绘制小提琴图 小提琴图效果代码 小提琴图 小提琴图(Violin Plot)是一种结合了箱线图和核密度估计图的图形,用于显示数据分布的情况。它不仅展示了数据的四分位数、最大值和最小值,还通过密度曲线展示了数据的分布形状。…...
【C++】6-7 你好,输出的格式控制(三角形)
6-7 你好,输出的格式控制(三角形) 分数 10 全屏浏览 切换布局 作者 向训文 单位 惠州学院 完善程序:输入行数rows(大于0),第一行输出rows个*,接下来每行的*个数减1,直…...
力扣每日一题 6/1
2928.给小朋友们分糖果[简单] 题目: 给你两个正整数 n 和 limit 。 请你将 n 颗糖果分给 3 位小朋友,确保没有任何小朋友得到超过 limit 颗糖果,请你返回满足此条件下的 总方案数 。 示例 1: 输入:n 5, limit 2 …...
决定短视频打开率的要素:成都鼎茂宏升文化传媒公司
在当下这个短视频盛行的时代,无论是个人创作者还是企业品牌,都希望通过短视频平台获得更多的曝光和关注。然而,如何让自己的短视频在众多内容中脱颖而出,吸引用户的点击和观看,成为了摆在我们面前的重要问题。成都…...
解决通过包管理器下载 Sharp 时遇到的二进制文件下载问题
sharp 是一个流行的 Node.js 库,用于高性能的图片处理。它依赖于预构建的 libvips 二进制文件,这些文件通常是从官方仓库下载的。 但在某些地区的网络环境下,直接下载可能会因为网络限制而失败。 通过在命令行中分别执行以下两行内容即可&a…...
反序输出c++
题目描述 输入n个数,要求程序按输入时的逆序把这n个数打印出来,已知整数不超过100个。也就是说,按输入相反顺序打印这n个数。 输入 输入一行共有n个数,每个数之间用空格隔开。 输出 如题要求:一行,共有n个数&…...
C++ 封装线程池(结合QT支持信号机制)
纯C风格线程池 纯C 风格线程池可参考这篇文章 https://llfc.club/category?catid225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2c2IJUcCUOfzEQQRRdOXYIZuCjP 视频教程 相关线程池和并发编程的视频可以看看这个连接: https://www.bilibili.com/video/BV1Xt421H7M7/?vd_s…...
c# 学习教程
打印语句 折叠代码 变量 整形 浮点型 特殊类型...