从0到1:用Lask/Django框架搭建个人博客系统(4/10)
摘要:本文深入解析了使用Lask和Django构建个人博客系统的全过程。从技术选型的考量,突出Lask的轻量灵活与Django的强大功能,到开发环境搭建、项目初始化,再到核心功能实现如文章管理、用户认证与权限控制,详细阐述了开发步骤与实现要点。同时,探讨了前端设计、模板渲染及系统优化部署等关键环节,为开发者提供了构建个人博客系统的全面指导。
1.技术选择:为何是 Lask 和 Django?
在 Python Web 框架的璀璨星空中,Lask 和 Django 无疑是两颗耀眼的明星。Lask,以其轻量级和灵活性著称,宛如一位灵动的舞者,能够在复杂的编程舞台上自由穿梭,轻松应对各种变化。它的核心功能简洁明了,就像搭建积木一样,开发者可以根据自己的需求自由选择和组合各种扩展,从而构建出独具特色的应用程序。这种灵活性使得 Lask 在处理一些小型项目或者对定制化要求较高的场景时,表现得尤为出色,能够快速地满足开发者的个性化需求,就像为每个项目量身定制的一件完美衣裳。
而 Django,则是一位全能的巨人,它以 “大而全” 的特点在 Web 开发领域占据着重要的地位。Django 遵循 “不要重复自己”(DRY)的原则,内置了大量丰富而强大的功能,仿佛一个装备齐全的超级英雄,拥有各种神奇的工具和技能。比如,它自带的对象关系映射(ORM)系统,就像是一把神奇的钥匙,能够轻松地打开数据库操作的大门,让开发者无需深入了解复杂的 SQL 语句,就能高效地与数据库进行交互;其自动生成的管理后台,更是一个强大的利器,极大地提高了开发效率,让开发者能够快速地对网站内容进行管理和维护;此外,Django 还内置了多种安全机制,如防跨站请求伪造(CSRF)、SQL 注入防护等,为应用程序的安全保驾护航,就像给应用穿上了一层坚固的铠甲 ,让开发者和用户都能安心使用。
对于构建个人博客系统而言,Lask 和 Django 都有着独特的优势,就像两位各有所长的工匠,能够打造出独一无二的博客作品。Lask 的轻量级和灵活性使得它在博客系统的开发中,能够快速地响应各种变化和需求。比如,如果你想要在博客中添加一些独特的功能,如个性化的推荐算法、与第三方社交平台的深度集成等,Lask 就能够轻松地实现,因为它允许你自由地选择和使用各种扩展,就像在一个丰富的工具库中挑选适合自己的工具一样。而且,Lask 的学习成本相对较低,对于初学者或者想要快速搭建一个简单博客系统的开发者来说,是一个非常不错的选择,能够让他们在短时间内就看到自己的成果,增强开发的信心和乐趣。
Django 则凭借其强大的功能和完善的生态系统,为博客系统提供了全方位的支持。它的 ORM 系统能够高效地管理博客中的数据,无论是文章、用户信息还是评论等,都能够有条不紊地进行存储和检索;自动生成的管理后台,让博主能够方便地对博客内容进行编辑、发布和管理,就像拥有了一个私人的助手,大大提高了管理效率;内置的安全机制,更是为博客的安全稳定运行提供了坚实的保障,让博主和读者都能够放心地使用博客,不用担心数据泄露或者安全漏洞等问题。此外,Django 丰富的第三方插件库,就像一个巨大的宝藏库,能够满足博客系统各种不同的需求,比如添加搜索功能、优化 SEO 等,让博客系统更加完善和强大。
2.环境搭建与项目初始化
在开始搭建个人博客系统之前,我们需要先搭建好开发环境,这就像是为一场精彩的演出搭建舞台,只有舞台搭建好了,后续的表演才能顺利进行。我们需要准备好 Python 环境,它是我们开发的基石,就像高楼大厦的地基一样重要。建议使用 Python 3.6 及以上版本,你可以从Python 官方网站下载并安装。安装过程中,记得勾选 “Add Python to PATH” 选项,这样就能在命令行中方便地使用 Python 命令了,就像为你打开了一扇通往 Python 世界的便捷之门 。本地windows电脑安装python环境和Pycharm开发工具建议查看我往期文章:01-Python详细安装教程(大妈看了都会)-CSDN博客
02-pycharm详细安装教程(大妈看了都会)
数据库方面,我们选择 SQLite,它是一个轻量级的数据库,就像一个小巧而灵活的工具箱,非常适合初学者和小型项目。SQLite 不需要额外的服务器进程,它将数据库存储在一个文件中,使用起来简单方便,就像把所有的工具都放在一个小箱子里,随时可以拿出来使用。而且,Django 默认就支持 SQLite,这使得我们在开发过程中可以更加轻松地集成数据库,就像为我们的项目找到了一个默契的伙伴 。
接下来,我们使用 Lask 和 Django 的命令行工具来初始化项目。打开命令行终端,进入你想要创建项目的目录,就像选择一个合适的场地来建造你的博客城堡。然后,使用 Django 的命令django - admin startproject my_blog来创建一个名为my_blog的 Django 项目。这个命令会自动生成一个基本的项目结构,就像为你的城堡搭建好了基本的框架 。
在生成的项目目录中,你会看到以下主要文件和目录:
- manage.py:这是一个 Django 项目的管理脚本,就像一个万能的钥匙,可以用来执行各种 Django 命令,比如运行服务器、创建应用、数据库迁移等,通过它,你可以轻松地掌控项目的各种操作。
- my_blog/:这个目录包含了项目的配置文件和一些初始化代码,就像城堡的核心控制室,里面的settings.py文件是项目的主要配置文件,你可以在里面设置数据库连接、安装的应用、静态文件路径等各种项目参数,就像为城堡的各种设施进行设置和调整;urls.py文件则是项目的 URL 配置文件,它负责将不同的 URL 请求映射到相应的视图函数,就像城堡的地图,指引着用户的请求到达正确的地方 。
初始化 Lask 项目相对简单一些,我们可以创建一个新的 Python 文件,比如app.py,然后导入 Lask 库,就像邀请一位重要的嘉宾来到我们的项目中。在app.py中,我们可以定义一些基本的路由和视图函数,例如:
from lask import Laskapp = Lask(__name__)@app.route('/')
def index():return "欢迎来到我的个人博客!"if __name__ == '__main__':app.run()
这样,我们就完成了项目的初始化,一个简单的博客系统框架已经搭建起来了,就像一座城堡的雏形已经出现,接下来我们就可以逐步为它添砖加瓦,让它变得更加完善和丰富。
3.核心功能开发:文章管理
(一)Lask 实现
在 Lask 框架下,我们使用 SQLAlchemy 库来设计数据库模型,它就像是一位出色的建筑师,能够帮助我们构建出结构清晰、功能完善的数据库架构。首先,我们需要安装 SQLAlchemy 库,可以使用pip install sqlalchemy命令进行安装,就像为我们的项目准备好各种建筑材料 。
安装完成后,我们可以在项目中定义文章模型。假设我们的文章包含标题、正文、创建时间等字段,定义如下:
from sqlalchemy import create_engine, Column, Integer, String, Text, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker# 创建数据库引擎,这里使用SQLite数据库
engine = create_engine('sqlite:///blog.db')
Base = declarative_base()
Session = sessionmaker(bind = engine)class Article(Base):__tablename__ = 'articles'id = Column(Integer, primary_key = True)title = Column(String(200), nullable = False)body = Column(Text, nullable = False)create_time = Column(DateTime, default = datetime.now)# 创建表结构
Base.metadata.create_all(engine)
在这个模型中,__tablename__指定了数据库表的名称为articles,就像给我们建造的房子取了一个名字;id是文章的唯一标识,是一个自增长的整数,就像房子的门牌号,每个房子都有唯一的门牌号来标识;title字段用于存储文章标题,最大长度为 200 个字符,不能为空,就像房子的名字,必须要有且不能太长;body字段存储文章的正文内容,使用Text类型,可以存储大量的文本,就像房子里面的各种房间,用来存放各种物品;create_time字段记录文章的创建时间,默认值为当前时间,就像记录房子建造完成的时间 。
接下来,我们编写视图函数来实现文章的添加、编辑、删除和展示逻辑。以添加文章为例,视图函数如下:
from lask import Lask, request
from models import Article, Sessionapp = Lask(__name__)@app.route('/article/add', methods=['POST'])
def add_article():session = Session()title = request.form.get('title')body = request.form.get('body')new_article = Article(title = title, body = body)session.add(new_article)session.commit()session.close()return "文章添加成功!"
在这个视图函数中,我们首先获取POST请求中的title和body数据,就像从快递包裹中取出里面的物品;然后创建一个新的Article对象,并将获取到的数据赋值给它,就像把物品放入一个新的盒子里;接着将这个对象添加到数据库会话中,并提交事务,就像把盒子送到仓库中保存起来;最后关闭会话,返回添加成功的提示信息,就像告诉快递员包裹已经成功送达 。
展示文章的视图函数可以这样写:
@app.route('/article/list')
def list_articles():session = Session()articles = session.query(Article).all()session.close()article_list = []for article in articles:article_info = {'id': article.id,'title': article.title,'create_time': article.create_time}article_list.append(article_info)return jsonify(article_list)
这个函数从数据库中查询出所有的文章,然后将文章的部分信息整理成一个列表返回,就像从仓库中取出所有的盒子,并把盒子上的重要信息记录下来展示给大家 。
同时,我们需要设置对应的路由,让 Lask 能够正确地将请求映射到这些视图函数上,就像为每个房间安排一个正确的门牌号,让人们能够准确地找到它们。上面的代码中已经通过@app.route装饰器设置了路由,例如/article/add路由对应添加文章的视图函数,/article/list路由对应展示文章列表的视图函数 。
(二)Django 实现
Django 的 ORM(对象关系映射)为我们提供了一种简洁而强大的方式来定义文章模型,它就像是一个智能的翻译官,能够将我们的 Python 代码与数据库操作进行无缝转换。在 Django 项目的应用目录下的models.py文件中,我们可以定义文章模型如下:
from django.db import modelsclass Article(models.Model):title = models.CharField(max_length = 200)body = models.TextField()create_time = models.DateTimeField(auto_now_add = True)
在这个模型定义中,title字段使用CharField类型,指定了最大长度为 200,这与 Lask 中使用 SQLAlchemy 定义的类似;body字段使用TextField类型来存储长文本;create_time字段使用DateTimeField类型,并设置auto_now_add=True,表示在创建文章时自动设置为当前时间 。
Django 内置的管理后台是一个非常强大的工具,它能够让我们轻松地对文章进行管理,就像一个专业的管家,能够帮助我们处理各种繁琐的事务。我们只需要在admin.py文件中注册文章模型,就可以使用管理后台了。例如:
from django.contrib import admin
from.models import Articleadmin.site.register(Article)
注册完成后,我们可以通过访问/admin/路径,使用管理员账号登录,就能够看到文章模型的管理界面。在这个界面中,我们可以方便地进行文章的添加、编辑、删除等操作,而且 Django 还提供了一些默认的验证和显示功能,大大提高了我们的管理效率 。
在视图函数和 URL 配置方面,我们可以创建一个视图函数来展示文章列表。在应用目录下的views.py文件中编写如下代码:
from django.shortcuts import render
from.models import Articledef article_list(request):articles = Article.objects.all()return render(request, 'article_list.html', {'articles': articles})
这个视图函数从数据库中获取所有的文章,并将其传递给article_list.html模板进行展示,就像把仓库中的所有盒子交给设计师,让设计师按照一定的布局展示给用户 。
然后,在项目的urls.py文件中配置 URL:
from django.contrib import admin
from django.urls import path
from. import viewsurlpatterns = [path('admin/', admin.site.urls),path('article/list/', views.article_list, name='article_list')
]
这样,当用户访问/article/list/路径时,就会调用article_list视图函数,展示文章列表 。通过 Django 的这些功能,我们能够快速地构建出一个功能完善的文章管理系统,为个人博客的内容管理提供坚实的基础。
4.核心功能开发:用户认证与权限管理
(一)Lask 实现
在 Lask 中,我们可以使用 Flask - Login 等扩展来实现用户认证和权限管理功能,它就像是给我们的博客系统加上了一把智能锁,只有拥有正确钥匙(合法用户)的人才能进入特定的区域(访问特定功能)。首先,我们需要安装 Flask - Login 扩展,可以使用pip install flask - login命令进行安装 。
安装完成后,我们进行配置。在项目中创建一个login.py文件,用于管理用户认证相关的逻辑,就像为我们的锁设置一个控制中心 。在login.py中,创建一个LoginManager对象,并将其绑定到 Lask 应用程序对象上,代码如下:
from flask_login import LoginManagerlogin_manager = LoginManager()
然后,在应用程序的__init__.py文件中,初始化LoginManager对象,并设置一些相关的配置,例如:
from lask import Lask
from.login import login_managerapp = Lask(__name__)
app.config['SECRET_KEY'] ='mysecretkey'
login_manager.init_app(app)
这里的SECRET_KEY是一个用于加密用户会话的密钥,就像锁的密码一样,非常重要,一定要妥善保管 。
接下来,我们需要定义用户模型。假设我们的用户模型包含用户名、密码等字段,使用 SQLAlchemy 定义如下:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from flask_login import UserMixinengine = create_engine('sqlite:///blog.db')
Base = declarative_base()
Session = sessionmaker(bind = engine)class User(UserMixin, Base):__tablename__ = 'users'id = Column(Integer, primary_key = True)username = Column(String(50), unique = True)password = Column(String(100))Base.metadata.create_all(engine)
在这个用户模型中,UserMixin类提供了一些默认的方法,用于实现用户认证相关的功能,比如判断用户是否已认证、是否是活跃用户等,就像为我们的用户模型添加了一些实用的工具 。
实现用户注册功能时,我们可以编写一个视图函数来处理注册请求。例如:
from lask import Lask, request
from models import User, Session
from werkzeug.security import generate_password_hashapp = Lask(__name__)@app.route('/register', methods=['POST'])
def register():session = Session()username = request.form.get('username')password = request.form.get('password')hashed_password = generate_password_hash(password)new_user = User(username = username, password = hashed_password)session.add(new_user)session.commit()session.close()return "注册成功!"
在这个视图函数中,我们获取用户提交的用户名和密码,使用generate_password_hash函数对密码进行加密,然后创建新的用户对象并保存到数据库中,就像为新用户制作一把加密的钥匙并保存到钥匙库中 。
实现用户登录功能时,视图函数如下:
from flask_login import login_user
from lask import request@app.route('/login', methods=['POST'])
def login():username = request.form.get('username')password = request.form.get('password')session = Session()user = session.query(User).filter_by(username = username).first()session.close()if user and check_password_hash(user.password, password):login_user(user)return "登录成功!"else:return "用户名或密码错误!"
这个函数首先从数据库中查询用户,然后使用check_password_hash函数验证密码是否正确,如果验证成功,就使用login_user函数将用户登录,就像验证用户的钥匙是否正确,如果正确就允许用户进入系统 。
对于权限验证机制,我们可以使用@login_required装饰器来保护需要用户登录才能访问的视图函数,就像在房间门口设置一个守卫,只有拥有正确钥匙(已登录用户)的人才能进入 。例如:
from flask_login import login_required@app.route('/protected')
@login_required
def protected():return "这是一个受保护的页面,只有登录用户可以访问。"
(二)Django 实现
Django 内置的用户认证系统就像是一个功能齐全的安保系统,为我们提供了强大而便捷的用户认证和权限管理功能。首先,在 Django 项目中,确保在settings.py文件中包含了认证相关的应用,即'django.contrib.auth'和'django.contrib.contenttypes',它们就像安保系统的核心组件,为整个认证系统提供支持 。
INSTALLED_APPS = [...'django.contrib.auth','django.contrib.contenttypes',...
]
创建用户非常简单,我们可以使用create_user方法来创建普通用户,使用create_superuser方法来创建超级用户,就像在安保系统中添加不同权限的用户 。例如,在 Python shell 中创建用户:
from django.contrib.auth.models import User# 创建普通用户
user = User.objects.create_user(username='testuser', password='testpassword')
# 创建超级用户
superuser = User.objects.create_superuser(username='admin', password='adminpassword', email='admin@example.com')
在创建用户时,Django 会自动对密码进行加密存储,确保用户密码的安全,就像为用户的密码加上了一层坚固的保护罩 。
用户登录功能可以通过authenticate和login函数来实现。authenticate函数用于验证用户名和密码是否正确,login函数用于将用户登录到当前会话中 。在视图函数中实现如下:
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirectdef user_login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')user = authenticate(request, username = username, password = password)if user is not None:login(request, user)return redirect('home')else:return render(request, 'login.html', {'error': '用户名或密码错误'})return render(request, 'login.html')
在这个视图函数中,首先获取用户提交的用户名和密码,然后使用authenticate函数进行验证,如果验证成功,就使用login函数将用户登录,并重定向到主页;如果验证失败,就返回登录页面并显示错误信息 。
用户注销功能可以使用logout函数来实现,它会清除当前用户的会话信息,就像让用户交出进入系统的钥匙 。视图函数如下:
from django.contrib.auth import logout
from django.shortcuts import redirectdef user_logout(request):logout(request)return redirect('login')
Django 的权限分配非常灵活,我们可以为用户或用户组分配不同的权限,就像为不同的人或团队赋予不同的访问权限 。每个模型默认会有add、change、delete三种权限,我们也可以自定义权限。例如,为用户分配权限:
from django.contrib.auth.models import User, Permissionuser = User.objects.get(username='testuser')
permission = Permission.objects.get(codename='add_article')
user.user_permissions.add(permission)
这里为testuser用户分配了add_article权限,使得该用户可以添加文章 。我们还可以通过用户组来管理权限,将具有相同权限需求的用户添加到同一个组中,然后为组分配权限,这样可以大大简化权限管理的工作,就像将一群人分成不同的小组,然后为每个小组赋予相应的权限 。例如:
from django.contrib.auth.models import Group, Permission# 创建组
editors_group = Group.objects.create(name='Editors')
# 获取权限
permission = Permission.objects.get(codename='change_article')
# 为组分配权限
editors_group.permissions.add(permission)
# 将用户添加到组
user = User.objects.get(username='testuser')
user.groups.add(editors_group)
通过 Django 内置的用户认证系统,我们能够轻松地实现用户认证与权限管理功能,为个人博客系统的安全和用户管理提供有力的支持,让博客系统的使用更加安全、有序 。
5.前端设计与模板渲染
(一)Lask 结合前端技术
在 Lask 项目中,集成 HTML、CSS、JavaScript 等前端技术,就像是为我们的博客系统穿上一件漂亮的外衣,使其更加美观和易用。我们可以使用模板引擎 Jinja2 来渲染页面,它就像是一个神奇的化妆师,能够将我们的数据和前端页面完美地融合在一起 。
首先,我们需要在项目中创建一个templates文件夹,用于存放 HTML 模板文件,就像为我们的衣服准备一个专属的衣柜 。例如,我们创建一个index.html模板文件,代码如下:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>我的个人博客</title><link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
</head><body><h1>欢迎来到我的个人博客</h1>{% for article in articles %}<div class="article"><h2>{{ article.title }}</h2><p>{{ article.body }}</p><p>创建时间:{{ article.create_time }}</p></div>{% endfor %}<script src="{{ url_for('static', filename='script.js') }}"></script>
</body></html>
在这个模板中,我们使用了 Jinja2 的语法。{{ url_for('static', filename='styles.css') }}用于生成静态文件styles.css的 URL 路径,这样我们就可以在 HTML 中引入 CSS 样式表,为页面添加样式,就像为衣服添加各种装饰元素 ;{{ article.title }}等变量用于显示文章的相关信息,这些变量会在视图函数渲染模板时被替换为实际的数据,就像将衣服上的占位符替换为真正的图案 ;{% for article in articles %}是 Jinja2 的循环标签,用于遍历文章列表并展示每一篇文章,就像将一排衣服依次展示出来 。
在 Lask 的视图函数中,我们使用render_template函数来渲染模板,并传递相关的数据。例如:
from lask import Lask, render_template
from models import Article, Sessionapp = Lask(__name__)@app.route('/')
def index():session = Session()articles = session.query(Article).all()session.close()return render_template('index.html', articles = articles)
在这个视图函数中,我们从数据库中获取所有的文章,然后使用render_template函数将index.html模板渲染,并将文章列表传递给模板,这样模板中的变量就会被替换为实际的数据,最终生成一个完整的 HTML 页面返回给用户 。
对于 JavaScript 文件,我们同样可以在 HTML 中通过{{ url_for('static', filename='script.js') }}来引入,JavaScript 可以为页面添加交互功能,比如实现文章的点赞、评论等功能,就像为衣服添加一些动态的效果,使其更加生动有趣 。
(二)Django 的模板系统
Django 自带的模板系统就像是一个功能强大的造型师,为我们提供了丰富的语法和使用技巧,让我们能够轻松地在模板中实现数据展示和交互逻辑 。
Django 模板的语法主要有变量、标签和过滤器。变量用于显示数据,使用双大括号{{ variable }}来表示,例如{{ article.title }}。标签用于控制逻辑和流程,使用{% tag %}来表示,比如{% for article in articles %}用于循环遍历文章列表,{% if condition %}用于条件判断 。过滤器用于对变量进行格式化和处理,使用管道符|来应用,例如{{ article.create_time|date:"Y-m-d H:i:s" }}将文章的创建时间格式化为指定的日期时间格式 。
以文章列表页面为例,我们在article_list.html模板中展示文章列表,代码如下:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>文章列表</title><link rel="stylesheet" href="{% static'styles.css' %}">
</head><body><h1>文章列表</h1>{% for article in articles %}<div class="article"><h2>{{ article.title }}</h2><p>{{ article.body }}</p><p>创建时间:{{ article.create_time|date:"Y-m-d H:i:s" }}</p></div>{% endfor %}<script src="{% static'script.js' %}"></script>
</body></html>
在这个模板中,{% static'styles.css' %}用于引用静态文件styles.css,与 Lask 中使用url_for类似,都是为了方便地引入静态资源 ;{{ article.title }}等变量显示文章的标题、正文等信息;{{ article.create_time|date:"Y-m-d H:i:s" }}使用过滤器将创建时间格式化为指定的字符串形式;{% for article in articles %}循环遍历文章列表,并将每篇文章的信息展示出来 。
在 Django 的视图函数中,我们使用render函数来渲染模板并传递数据,例如:
from django.shortcuts import render
from.models import Articledef article_list(request):articles = Article.objects.all()return render(request, 'article_list.html', {'articles': articles})
这个视图函数从数据库中获取所有文章,然后通过render函数将article_list.html模板渲染,并将文章列表传递给模板,最终生成包含文章列表的 HTML 页面返回给用户 。通过 Django 的模板系统,我们能够灵活地展示数据,并结合前端技术实现丰富的交互功能,为用户提供更好的使用体验 。
6.系统优化与部署
6.1 性能优化建议
在个人博客系统的开发中,缓存机制是提升系统性能的关键利器,它就像是一个高效的助手,能够大大减少数据库的负载,提高系统的响应速度。我们可以使用 Redis 作为缓存工具,它是一个高性能的内存数据库,就像一个超级快速的存储仓库,能够快速地存储和读取数据 。
在 Django 项目中,配置 Redis 缓存非常简单。首先,安装redis - py库,可以使用pip install redis - py命令进行安装 。然后,在settings.py文件中进行如下配置:
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/1","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}}
}
这里将缓存的后端设置为django_redis.cache.RedisCache,指定了 Redis 服务器的地址和端口,以及使用的数据库编号为 1 。
在视图函数中,我们可以使用缓存来存储查询结果。例如,对于文章列表视图函数,我们可以这样修改:
from django.views.decorators.cache import cache_page@cache_page(60 * 15) # 缓存15分钟
def article_list(request):articles = Article.objects.all()return render(request, 'article_list.html', {'articles': articles})
使用cache_page装饰器,将视图函数的结果缓存 15 分钟,这样在这 15 分钟内,再次访问该页面时,直接从缓存中获取数据,而不需要再次查询数据库,大大提高了访问速度 。
数据库优化也是至关重要的一环,它就像是为我们的博客系统打造一个坚固稳定的地基。合理设计数据库索引,能够显著提高查询效率。例如,在文章模型中,如果经常根据文章标题进行查询,我们可以为title字段添加索引:
class Article(models.Model):title = models.CharField(max_length = 200, db_index = True)body = models.TextField()create_time = models.DateTimeField(auto_now_add = True)
这里通过db_index = True为title字段添加了索引,使得在根据标题查询文章时,数据库能够更快地定位到相应的数据 。
同时,我们要避免使用复杂的查询语句,尽量优化查询逻辑。例如,在查询文章列表时,尽量减少不必要的关联查询和子查询,这样可以降低数据库的执行压力,提高查询速度 。
6.2 部署步骤
将开发好的个人博客系统部署到服务器上,是让我们的博客能够被更多人访问的关键一步,这就像是将我们精心打造的作品展示在一个大舞台上 。
首先,我们需要选择一台合适的服务器,比如阿里云、腾讯云等云服务器,它们就像是坚固的舞台支架,为我们的博客提供稳定的运行环境 。购买服务器后,我们要进行服务器的基础配置,包括安装操作系统(如 Ubuntu、CentOS 等)、配置安全组规则等 。
在 Ubuntu 系统中,安装 Nginx 服务器,它就像是一个优秀的舞台主持人,负责将用户的请求转发到我们的博客应用程序 。可以使用以下命令进行安装:
sudo apt update
sudo apt install nginx
安装完成后,Nginx 的配置文件位于/etc/nginx/nginx.conf,我们需要根据博客系统的实际情况进行配置,比如设置服务器的域名、监听端口等 。
接下来,配置 Django 项目。在服务器上创建一个目录,用于存放项目代码,比如/var/www/my_blog 。将本地的项目代码上传到服务器的该目录下,可以使用scp命令或者 FTP 工具 。
进入项目目录,安装项目所需的依赖包。首先,确保服务器上已经安装了 Python 和 pip,然后使用pip install -r requirements.txt命令安装项目的依赖包,requirements.txt文件中列出了项目所需的所有 Python 库,就像一份详细的购物清单,我们根据这份清单来安装所需的库 。
配置数据库连接。如果使用的是 MySQL 等数据库,需要在服务器上安装相应的数据库,并在 Django 项目的settings.py文件中配置好数据库连接信息,包括数据库的地址、端口、用户名、密码等 。
运行数据库迁移命令,将数据库模型同步到服务器的数据库中。在项目目录下执行python manage.py migrate命令,这个命令会根据我们定义的模型创建相应的数据库表和字段,就像按照设计图纸建造房子一样 。
收集静态文件。Django 项目中的静态文件(如 CSS、JavaScript、图片等)需要收集到一个指定的目录中,以便 Nginx 能够正确地访问它们 。执行python manage.py collectstatic命令,将静态文件收集到settings.py文件中设置的STATIC_ROOT目录下 。
配置 Nginx 反向代理。在 Nginx 的配置文件中,添加一个反向代理的配置,将用户对博客系统的请求转发到 Django 应用程序 。例如:
server {listen 80;server_name your_domain.com;location / {proxy_pass http://127.0.0.1:8000;proxy_set_header Host $host;proxy_set_header X - Real - IP $remote_addr;proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;proxy_set_header X - Forwarded - Proto $scheme;}location /static/ {alias /var/www/my_blog/static/;}
}
这里将your_domain.com替换为你的域名,/var/www/my_blog/static/替换为实际的静态文件目录 。
最后,启动 Django 应用程序和 Nginx 服务器。在项目目录下执行python manage.py runserver 127.0.0.1:8000命令启动 Django 应用,然后使用sudo systemctl start nginx命令启动 Nginx 服务器 。此时,通过访问你的域名,就可以看到部署好的个人博客系统了 。
在部署过程中,要注意权限的设置,确保相关用户对文件和目录有正确的读写权限,同时要及时处理可能出现的错误和问题,比如依赖包安装失败、数据库连接错误等,通过查看日志文件(如 Django 的日志文件和 Nginx 的日志文件)来定位和解决问题 。
7.总结与展望
7.1 文章总结
在本次使用 Lask 和 Django 框架构建个人博客系统的过程中,我仿佛经历了一场充满挑战与惊喜的冒险。从最初的技术选型,就像是在众多宝藏中挑选最适合自己的那一个,到一步步搭建环境、开发核心功能,每一个环节都倾注了我的心血。在这个过程中,我深刻体会到了 Lask 的轻量级与灵活性,以及 Django 的强大功能和完善生态系统带来的便利,就像同时拥有了一把灵活的瑞士军刀和一套功能齐全的专业工具,能够应对各种开发需求。
通过这次实践,我不仅掌握了如何使用这两个框架构建一个功能完备的个人博客系统,还对 Python Web 开发有了更深入的理解,就像打开了一扇通往更广阔编程世界的大门 。在技术层面,我熟练运用了 SQLAlchemy 和 Django 的 ORM 进行数据库操作,学会了使用 Flask - Login 和 Django 内置的用户认证系统实现用户认证与权限管理,掌握了 Jinja2 和 Django 模板系统来渲染前端页面 。同时,在性能优化和部署方面,我也积累了宝贵的经验,如使用 Redis 缓存提升系统性能,以及将博客系统成功部署到服务器上,让它能够面向更多的用户 。
展望未来,这个个人博客系统还有许多可扩展的功能和改进的方向,就像一座尚未完全建成的城堡,还有很多地方可以继续完善和装饰 。在功能扩展方面,我计划添加文章分类和标签功能,就像为书籍分类和贴上标签一样,方便用户更快速地找到自己感兴趣的文章;实现搜索功能,让用户能够通过关键词搜索相关文章,提高信息检索的效率;集成评论系统,促进用户之间的交流和互动,让博客成为一个真正的交流平台 。此外,我还打算增加用户个性化设置功能,比如用户可以自定义博客的主题、字体等,满足不同用户的个性化需求 。
在系统性能和用户体验方面,我将进一步优化系统,减少页面加载时间,提高系统的响应速度,就像为一辆汽车进行性能优化,让它跑得更快更稳 。同时,我会注重界面设计的优化,使其更加美观、简洁,提升用户的使用体验,就像为房子精心装修,让居住者更加舒适 。并且,随着移动互联网的发展,我还计划开发博客的移动端应用,或者优化博客在移动端的显示效果,让用户能够随时随地访问和使用博客 。
在未来的开发过程中,我也会不断学习和探索新的技术,如人工智能、大数据等,尝试将这些技术应用到博客系统中,为用户提供更智能、更个性化的服务 。例如,利用人工智能技术实现文章的自动摘要、智能推荐等功能,让用户能够更高效地获取信息 。我相信,通过不断地努力和改进,这个个人博客系统将会变得越来越完善,为用户带来更好的体验,也为我自己的技术成长积累更多的经验 。
7.2 关键字
-
Lask :轻量级Python Web框架,以灵活性著称,适合小型项目或定制化需求高的场景,开发者可自由组合扩展构建应用。
-
Django :功能强大、生态完善的Python Web框架,内置ORM、管理后台等丰富功能,遵循DRY原则,能高效开发复杂应用。
-
个人博客系统 :本文核心项目,围绕其构建展开技术选型、功能开发、优化部署等详细探讨。
-
环境搭建 :开发前的关键步骤,包括Python环境准备、数据库选择(如SQLite)及项目初始化,为后续开发奠定基础。
-
文章管理 :博客系统核心功能之一,涵盖文章的增删改查,详细展示了在Lask和Django中实现该功能的代码逻辑与数据库操作。
-
用户认证与权限管理 :保障博客系统安全的重要功能,介绍了Lask结合Flask-Login及Django内置认证系统实现用户注册、登录及权限分配的方法。
-
模板渲染 :前端展示的关键环节,讲解了Lask的Jinja2模板引擎和Django模板系统如何结合前端技术实现数据展示与页面交互。
-
系统优化 :为提升博客性能,介绍了缓存机制(如Redis缓存)、数据库优化(索引设计、查询优化)等策略。
-
部署 :将博客系统部署到服务器的详细步骤,包括服务器选择、配置、Nginx反向代理设置等,使博客可对外访问。
-
功能扩展 :对博客系统的未来展望,如添加分类、标签、搜索、评论功能及移动端优化等,以持续提升用户体验。
相关文章推荐:
1、Python详细安装教程(大妈看了都会)
2、02-pycharm详细安装教程(大妈看了都会)
3、如何系统地自学Python?
4、Alibaba Cloud Linux 3.2104 LTS 64位 怎么安装python3.10.12和pip3.10
5、职场新技能:Python数据分析,你掌握了吗?
6、Python爬虫图片:从入门到精通
串联文章:
1、Python小白的蜕变之旅:从环境搭建到代码规范(1/10)
2、Python面向对象编程实战:从类定义到高级特性的进阶之旅(2/10)
3、Python 异常处理与文件 IO 操作:构建健壮的数据处理体系(3/10)
相关文章:
从0到1:用Lask/Django框架搭建个人博客系统(4/10)
摘要:本文深入解析了使用Lask和Django构建个人博客系统的全过程。从技术选型的考量,突出Lask的轻量灵活与Django的强大功能,到开发环境搭建、项目初始化,再到核心功能实现如文章管理、用户认证与权限控制,详细阐述了开…...
探索 C++23 的 views::cartesian_product
文章目录 一、背景与动机二、基本概念与语法三、使用示例四、特点与优势五、性能与优化六、与 P2374R4 的关系七、编译器支持八、总结 C23 为我们带来了一系列令人兴奋的新特性,其中 views::cartesian_product 是一个非常实用且强大的功能,它允许我们轻…...
微软拼音自定义词库方法
1.准备文件input.txt 令狐冲 郭靖2.使用python转成微软拼音需要的格式 from xpinyin import Pinyin # pip install xpinyin -i https://pypi.tuna.tsinghua.edu.cn/simplep Pinyin()with open(input.txt, r, encodingutf-8) as infile:with open(output.txt, w, encodingutf…...
SQLite3常用语句汇总
SQLite 命令行工具(sqlite3 shell) 中的内置命令 命令作用说明.open filename.db打开或创建一个 SQLite 数据库文件.tables列出当前数据库中的所有表.schema [table]查看某个表或所有表的建表语句(DDL).headers ON/OFF开启或关闭…...
数据库设计三范式
第一范式 (1NF) 每个表中的每一列都是原子值 每个表中的每一行都是唯一的 下面这个表格就是不符合第一范式的例子:因为学时数能够拆分为讲课和实验。所以他并不是每一列都是原子值。 不仅要考虑列是否是原子值,还需要考虑每列的值是否可拆分。 第二范…...
GoWeb开发
学习目标: 本篇要达到的目的,能为后续复习提供极大便利。 (当我写下本篇博客时,已复习3遍) 一、网络通信概述 (为本篇基础核心内容) 1、什么是网络通信? 网络通信是指不同设备&…...
(7)Nokov 室内光学跟踪系统
文章目录 前言 7.1 所需硬件 7.2 Nokov 系统设置 7.3 配置旋翼机 7.4 启动 Nokov 模块 7.5 MAVProxy 准备 7.6 测试飞行 7.7 参数说明 前言 本文将介绍如何通过 Nokov 运动捕捉系统向旋翼机传输姿势信息。联系方式:NOKOV | Optical Motion Capture System。…...
Linux Shell编程和循环语句
一.for循环语句 1.for语句的结构2.for循环语句实例①根据姓名列表来批量创建多个用户②根据IP地址列表检查主机状态 二.使用while循环语句1.while语句结构2.while循环语句应用①批量添加规律编号用户②猜价格游戏 三 until循环语句1.until语句结构① 计算1-50的和 1.for语句的结…...
Java后端程序员学习前端之JavaScript
1.什么是JavaScript 1.1.概述 JavaScript是一门世界上最流行的脚本语言javaScript 一个合格的后端人员,必须要精通JavaScript 1.2.历史 JavaScript的起源故事-CSDN博客 2.快速入门 2.1.引入JavaScript 1.内部标签 <script>//.......</script> --…...
redis多路复用IO模型 以及 6.0引入的多线程模型
redis为什么选择单线程 采用多线程的话,会出现上下文切换的开销采用多线程,会带来共享资源的竞争控制,比如多个线程同时访问同一个资源(键值)时,需要额外的手段来保障共享资源的正确性,会带来额…...
101alpha_第6个
第6个alpha (-1 * correlation(open, volume, 10)) 这个就是看这两个相似性。10天之内的 如果结果为正且数值较大,投资者可能会认为在开盘价上涨时成交量萎缩,市场上涨动力不足,可能是卖出信号;反之,开盘价下跌时成交…...
crawl4ai能替代scrapy等传统爬虫框架吗?
传统爬虫框架就像拿着渔网在数字海洋中捕鱼——虽然能捞到东西,但面对现代网站的复杂性时常常"漏网之鱼"满天飞。以Scrapy为代表的工具存在三大致命短板:首先是JavaScript盲区,对动态渲染内容束手无策,就像试图用收音机…...
Sui Basecamp 2025 全栈出击
“我们不仅仅是在构建一个 L1,我们是在重建互联网。” — — Mysten Labs 首席产品官 Adeniyi Abiodun 本届 Sui Basecamp 汇聚了 Web3 领域的建设者、合作伙伴和思想领袖,为期两天,不仅展示了 Sui 的未来,也展现了去中心化互联网…...
计算机体系架构-----设计模式:状态模式(从程序员加班问题切入)
文章目录 1.梦开始的地方2.代码1.0版本3.代码2.0版本4.代码3.0版本5.梦结束的地方 最近在学习这个专业课里面的体系结构这门课程,作为专业里面的一门基础课,这个课程里面主要讲解的就是软件的设计思想,一些历程之类的,包括了面向对…...
【C/C++】RPC与线程间通信:高效设计的关键选择
文章目录 RPC与线程间通信:高效设计的关键选择1 RPC 的核心用途2 线程间通信的常规方法3 RPC 用于线程间通信的潜在意义4 主要缺点与限制4.1 缺点列表4.2 展开 5 替代方案6 结论 RPC与线程间通信:高效设计的关键选择 在C或分布式系统设计中,…...
数据结构之串
一、串的定义与基本概念 1. 串的定义 定义:串是由零个或多个字符组成的有限序列,记作 s"a1a2…an",例如 "data structure"、"123" 等。 空串:无任何字符,长度为 0,…...
基于腾讯云MCP广场的AI自动化实践:爬取小红书热门话题
基于腾讯云MCP广场的AI自动化实践:爬取小红书热门话题 我正在参加Trae「超级体验官」创意实践征文,本文所使用的 Trae 免费下载链接:www.trae.com.cn/?utm_source… 🔎 背景 在人工智能快速发展的时代,AI技术不仅重…...
AI领域的MCP(Model-Centric Paradigm)
1. 什么是MCP(Model-Centric Paradigm)? MCP(Model-Centric Paradigm)是人工智能开发中的一种核心理念,强调以模型的优化与改进作为主要驱动因素来提升AI系统的表现。在MCP模式下,开发者专注于…...
裸辞8年前端的面试笔记——JavaScript篇(一)
裸辞后的第二个月开始准备找工作,今天是第三天目前还没有面试,现在的行情是一言难尽,都在疯狂的压价。 下边是今天复习的个人笔记 一、事件循环 JavaScript 的事件循环(Event Loop)是其实现异步编程的关键机制。 从…...
力扣刷题Day 41:除自身以外数组的乘积(238)
1.题目描述 2.思路 方法1:搞一个数组存放各元素之前所有数的乘积(头为1),再搞一个数组存放各元素之后所有数的乘积(尾为1)。 方法2:上面的方法是很好理解的,在此基础上应该如何优化…...
金仓数据库征文-金仓KES数据同步优化实践:逻辑解码与增量同步
目录 一.同步场景与方案选型 二.同步环境配置 1.前置条件验证 2.逻辑解码配置 三.同步实施与问题排查 1.结构映射规则 2.增量数据捕获 3.数据一致性校验 四.性能调优实践 1.同步线程优化 2.批量提交优化 3.资源监控指标 五.典型场景解决方案 1.双向同步冲突处理 …...
【前端基础】9、CSS的动态伪类(hover、visited、hover、active、focus)【注:本文只有几个粗略说明】
一、什么是伪类 选择器的一种,用于选择处于特定状态的元素。 最常见的现象:鼠标放在某些文字上面,文字就会加上颜色。 鼠标没放上去之前: 鼠标放上去之后: 二、动态伪类 图片来源(链接文章也有其他伪…...
企业开发平台大变革:AI 代理 + 平台工程重构数字化转型路径
在企业数字化转型的浪潮中,开发平台正经历着前所未有的技术革命。从 AST(抽象语法树)到 AI 驱动的智能开发,从微服务架构到信创适配,这场变革不仅重塑了软件开发的底层逻辑,更催生了全新的生产力范式。本文…...
ZooKeeper工作机制与应用场景
目录 1.1、概述1.2、选举机制1.2.1、选举触发条件1.2.2、选举规则1.2.3、选举过程详解 1.3、数据同步机制1.3.1、正常同步1.3.2、宕机同步 1.4、客户端常用命令1.5、应用场景1.5.1、配置管理1.5.2、命令服务1.5.3、分布式锁服务1.5.4、集群管理1.5.5、分布式ID1.5.6、分布式协调…...
VR制作软件用途(VR制作软件概述)
虚拟现实(VR)制作软件作为现代科技的瑰宝,正以独特的魅力重塑各行各业。 通过构建三维虚拟环境,这些软件提供了前所未有的沉浸式体验,还推动了技术革新与产业升级。本文将探讨VR制作软件的主要用途,并重点…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.1 业务场景与数据准备
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 9.1 业务场景与数据准备9.1.1 业务场景描述核心业务目标业务挑战 9.1.2 数据来源与获取数据源构成数据获取方案 9.1.3 数据结构与字段说明核心数据表设计1. 订单事实表&…...
PyTorch 入门与核心概念详解:从基础到实战问题解决
PyTorch 入门与核心概念详解:从基础到实战问题解决 前言 用PyTorch 编写 Transformer 模型时遇到了多个错误,包括维度不匹配、NaN 损失、注意力权重未记录以及 OpenMP 库初始化等问题。 本文基于以上,对 PyTorch 的基本解释,并对…...
【办公类-99-05】20250508 D刊物JPG合并PDF便于打印
背景需求 委员让我打印2024年2025年4月的D刊杂志,A4彩打,单面。 有很多JPG,一个个JPG图片打开,实在太麻烦了。 我需要把多个jpg图片合并成成为一个PDF,按顺序排列打印。 deepseek写Python代码 代码展示 D刊jpg图片合…...
【C++】手搓一个STL风格的string容器
C string类的解析式高效实现 GitHub地址 有梦想的电信狗 1. 引言:字符串处理的复杂性 在C标准库中,string类作为最常用的容器之一,其内部实现复杂度远超表面认知。本文将通过一个简易仿照STL的string类的完整实现,揭示其设…...
无实体对话式社交机器人 拟人化印象形成机制:基于多模态交互与文化适配的拓展研究
《如何感知AI对话者:无实体对话式社交机器人拟人化对其印象形成效果影响机制的实验研究》解析 一、研究背景与核心问题 (一)技术背景与研究动机 随着生成式AI技术发展,以ChatGPT、文心一言为代表的无实体对话式社交机器人兴起,用户对其高度拟人化特征有显著需求,如扮演…...
存储器:DDR和独立显卡的GDDR有什么区别?
本文来简要对比DDR(Double Data Rate SDRAM)和GDDR(Graphics Double Data Rate SDRAM)的区别,重点说明它们在设计、性能和应用上的差异: 1. 设计目标与架构 DDR:通用型DRAM,设计为…...
viewDesign里的table内嵌套select动态添加表格行绑定内容丢失
问题 描述 viewDesign里的table内嵌套select,表格的行数是手动点击按钮添加的,添加第一行选择select的内容能正常展示,添加第二行第一行的select的内容消失 代码 <FormItem label"内饰颜色"><Tableclass"mt_10&q…...
vue v-html无法解析<
vue v-html无法解析字符串的小于号 方法一:可以替换成转义符 (实际还是会报错) let str 12345<445667 str.replaceAll(<, <)方法二:可以替换成中文小于号 let str 12345<445667 str.replaceAll(<, <)...
COLT_CMDB_linux_userInfo_20250508.sh修复历史脚本输出指标信息中userName与输出信息不一致问题
#!/bin/bash #IT_BEGIN #IT_TYPE3 #IT SYSTEM_LINUX_AGENTUSERDISCOVER|discovery.user[disc] #原型指标 #IT_RULE SYSTEM_LINUX_AGENTUSERGROUPID|groupId[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERHOME|userHome[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERNAME|user…...
A. Row GCD(gcd的基本性质)
Problem - 1458A - Codeforces 思路: 首先得知道gcd的两个基本性质: (1) gcd(a,b)gcd(a,|b-a|) (2) gcd(a,b,c)gcd(a,gcd(b,c)) 结合题目所给的a1bj,a2bj...... anbj 根据第一条性质得到: gcd(a1bj,a2bj)gcd(…...
k8s术语之Horizontal Pod Autoscaling
应用的资源使用率通常都有高峰和低谷的时候,如何削峰填谷,提高整体的整体资源利用率,让service中的Pod个数自动调整呢?Horizontal Pod Autoscaling:使pod水平自动缩放。这个Object也是最能体现kubernetes之于传统运维价值的地方&a…...
函数级重构:如何写出高可读性的方法?
1. 引言:为什么方法级别的重构如此重要? 在软件开发中,方法(函数)是程序逻辑的基本单元。一个高质量的方法不仅决定了程序是否能正常运行,更直接影响到: 代码的可读性:能否让其他开发者快速理解可维护性:未来修改是否容易出错可测试性:是否便于编写单元测试协作效率…...
手撕基于AMQP协议的简易消息队列-8(单元测试的编写)
在MQTest中编写模块的单元测试 在MQTest中编写makefile文件来编译客户端模块 all:Test_FileHelper Test_Exchange Test_Queue Test_Binding Test_Message Test_VirtualHost Test_Route Test_Consumer Test_Channel Test_Connection Test_VirtualHost:Test_VirtualHost.cpp ..…...
硬件选型:工控机的选择要素
在机器视觉应用中,工控机作为核心计算设备,承担着图像处理、数据分析和设备控制等多重任务。由于机器视觉常常在工业自动化、质量检测和精密控制中发挥重要作用,工控机的选型直接影响系统的性能和可靠性。 1. 应用场景与需求 机器视觉系统广…...
【芯片设计- RTL 数字逻辑设计入门 4.1 -- verilog 组合逻辑和时序逻辑延时比较】
文章目录 Overview时间线简单示意Overview 我们来详细分析下面这段 RTL Code , sbcs_sbbusy 为什么会比 sbcs_sbbusy_nx 慢一拍(晚一个时钟周期变化)。 assign sbcs_sbbusy_nx = set_sbcs_sbbusy;always @(posedge clk or negedge dmi_resetn) beginif (!dmi_resetn) begi…...
关于ubuntu下交叉编译arrch64下的gtsam报错问题,boost中boost_regex.so中连接libicui18n.so.55报错的问题
交叉编译gtsam时遇到的报错信息如下:gtsam需要连接boost, 解决办法: 1.重新编译boost可解决。 2.自己搞定生成一个libicui18n.so.55。 由于我们的boost是公用的,因此1不太可能(我试过重新编译完boost,在编译gtsam完…...
IoT平台和AIoT平台的区别
1. 什么是AIoT平台? AIoT(人工智能物联网,Artificial Intelligence of Things)平台 是 人工智能(AI) 与 物联网(IoT) 深度融合的技术框架,通过将AI算法嵌入物联网终端或…...
iOS 模块化开发流程
iOS模块化开发是一种将大型项目拆分为独立、可复用模块的开发模式,能够提升代码可维护性、团队协作效率和动态交付能力。以下是iOS模块化开发的核心流程与关键要点: 一、模块化设计阶段 业务解耦与模块划分 横向分层:基础层(网络、…...
云原生安全治理体系建设全解:挑战、框架与落地路径
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:云原生环境下,安全治理正在被重构 在传统IT架构中,安全防护多依赖边界设备(如防火墙、WAF、堡垒机)进行集中式防护。然而,在云原生环境下,这种“边界式”安全模型正面临颠覆。 应用微服务化…...
如何在Vue-Cli中使用Element-UI和Echarts和swiper插件(低版本)
1st.Element-UI 1.1 安装 在终端输入 npm install element-ui 1.2 导入 在全局main.js中全局导入Element-UI: // 导入element-ui组件库 import ElementUI from element-ui; // 导入element-ui组件库的样式 import element-ui/lib/theme-chalk/index.css; // 注…...
[特殊字符]【实战教程】用大模型LLM查询Neo4j图数据库(附完整代码)
🌟 核心要点速览 ✅ 基于LangChain框架实现LLM查询Neo4j ✅ 使用Qwen2.5模型(实测Llama3.1查不出内容) ✅ 包含完整数据准备代码实现效果演示 ✅ GitHub/Gitee源码已同步(文末获取) 🛠️ 环境准备 1️⃣ 安装Neo4j图数据库 # Windows安装指南参考&…...
Qt获取CPU使用率及内存占用大小
Qt 获取 CPU 使用率及内存占用大小 文章目录 Qt 获取 CPU 使用率及内存占用大小一、简介二、关键函数2.1 获取当前运行程序pid2.2 通过pid获取运行时间2.3 通过pid获取内存大小 三、具体实现五、写在最后 一、简介 近期在使用软件的过程中发现一个有意思的东西。如下所示&a…...
算法解密:除自身以外数组的乘积问题详解
算法解密:除自身以外数组的乘积问题详解 一、引言 在算法的奇妙旅程中,我们时常会遇到一些看似简单却蕴含深刻智慧的问题,“除自身以外数组的乘积”就是其中之一。这个问题不仅考验我们对数组操作的熟练程度,还要求我们在特定的限制条件下(不能使用除法且时间复杂度为O(n…...
基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)
#作者:闫乾苓 文章目录 概念和架构概述主要特点消息传递核心概念Pulsar 的消息模型Pulsar 的消息存储与分发Pulsar 的高级特性架构BrokerBookKeeperZooKeeper 概念和架构 概述 Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由雅虎开…...
信创生态核心技术栈:数据库与中间件
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...