网络编程实践笔记_4_阿贝云_免费云服务器_简易博客_

news/2025/10/18 21:18:23/文章来源:https://www.cnblogs.com/mengl05/p/19147221

有了简单方便的服务器,(在我的理解下还是个电脑主机,只不过连着网,实际就像个内网的AGV小车,可以ssh到他而已),

ssh远程控制和scp远程传输文件之后,就可以准备代码了,

没做过网页编码,也没了解过什么前后台。

也不知道刚开始要干嘛,就在百度AI搜了一下:

“想自己搭建一个服务器,建立一个微型信息收发服务器”

结果给出的结果是

硬件准备

建议使用闲置电脑或树莓派作为基础设备,配置至少双核CPU(如i5)、8GB内存和500GB SSD+HDD混合存储,确保千兆网卡支持23。若追求低功耗,树莓派是理想选择,其功耗仅5W左右2。

操作系统选择

推荐Ubuntu Server或CentOS等Linux系统,它们免费且稳定性高,适合运行轻量级服务23。若习惯Windows环境,可选用Windows Server 2016及以上版本,但需注意驱动兼容性问题4。

就光看到很高的配置,下面的也没仔细看。

然后AI搜索了一下:

“如何在免费云平台上搭建服务器”

习惯的往下拽看内容,结果上面可选项里最后一条吸引了我的注意力:

阿贝云‌:国内免备案服务,免费虚拟主机+域名,适合个人博客或测试环境

也不懂什么是备案,什么是域名,就记住名字了,

接着AI搜:

”阿贝云上搭建微型服务器“

给出一段稍微能看懂的代码,是python写的,喜出望外,这个比较熟,还省事,就这么干了

(上面还有一段关键的,就是防火墙放行端口那命令,又被习惯的略过了,导致后来折腾了一天时间)

不过经过上面的搜索,看到了几个关键词,flask看出是个py库,还有系统名字是CentOS,应该是就是Ubantu的马甲,

还有一个不知道是什么的Gunicorn

都扔给AI,继续AI搜索:

“阿贝云的使用方式,比如想要用python+flask做一个最简单的博客应用,使用CentOS,Gunicorn”

这次有详细操作过程和两端代码,全拷贝下来,照着做。

在CentOS系统上使用Python+Flask部署博客应用,可通过Gunicorn作为WSGI服务器实现生产环境运行。以下是关键步骤和配置方法:

环境准备与依赖安装

需安装Python 3、pip及Flask框架,通过pip install flask gunicorn命令安装核心依赖12。对于数据库支持,可添加SQLAlchemy或直接使用SQLite3。

应用代码结构

基础Flask应用需包含路由定义和模板渲染功能。例如主文件app.py需定义首页路由和文章展示逻辑,使用render_template加载HTML模板34。

Gunicorn部署配置

通过命令gunicorn --bind 0.0.0.0:5000 app:app启动服务,其中app:app表示模块名与应用实例名12。若需后台运行,可结合nohup或Supervisor管理进程2。

完整项目示例

以下为博客应用的完整代码结构和部署文件:

 #旁白:这里有个可以点的按钮,点开右边就会出现3个文件,每个里面分别有内容

代码说明:

  1. app.py定义基础路由和文章数据模拟;
  2. index.html使用Jinja2模板引擎渲染动态内容;
  3. requirements.txt列出运行所需的Python包及版本。

部署时需将整个项目上传至CentOS服务器,通过虚拟环境安装依赖后,使用Gunicorn命令启动服务12。对于持久化存储,可扩展SQLAlchemy实现数据库集成3。

中途和前面还有点AI搜索内容,主打就是一个哪里不懂问哪里,在代码量不大的情况下,AI给出的回答还是挺丰富的,要自己取舍理解

记得他最先给的一个创建文章的html文件,使用的命令和整体博客系统给的不一样,我还追问了

@app.route('/create', methods=['GET', 'POST']) def create(): if request.method == 'POST': title = request.form['title'] content = request.form['content'] new_post = Post(title=title, content=content) db.session.add(new_post) db.session.commit() return redirect(url_for('index')) return render_template('create.html') 使用了这种数据库创建函数,请修改index.html与之对应

之后又给了我一个40多行的更新后的网页文件。

在本地拿pycharm运行他给的三个文件之一的main.py,各种提示命令找不到,然后接着搜,按回答,安装各种pip包,最后运行起来,pycharm下面的输出栏里就会出现本机地址:5000 这么一个链接,点开就自动打开浏览器,结果一个空白还是个404没记住,pycharm下面信息也报错了,提示找不到index.html.

老规矩接着搜,原来是没把网页文件放到合适的文件夹里,我还好奇百度给的代码里,网页文件名前面带着路径。。。。按他给的结构,建立好文件夹,放到对应位置。再运行!

image

 横空出世

然后自己新建了好多,一个个便利贴样子的帖子就出来啦,不过排布方式和显示方式我也控制不了,不过也挺满意的,后续的代码修改,也可以进行了

image

 

image

 结构中,index.html 代码如下:

 1 <!DOCTYPE html>
 2 <html lang="zh-CN">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <title>我的博客</title>
 7     <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
 8 </head>
 9 <body class="bg-light">
10     <div class="container py-5">
11         <div class="d-flex justify-content-between align-items-center mb-4">
12             <h1 class="display-4">文章列表</h1>
13             <a href="/create" class="btn btn-primary">新建文章</a>
14         </div>
15 
16         <div class="row g-4">
17             {% for post in posts %}
18             <div class="col-md-6 col-lg-4">
19                 <div class="card shadow-sm h-100">
20                     <div class="card-body">
21                         <h5 class="card-title">{{ post.title }}</h5>
22                         <p class="card-text text-muted">{{ post.content|truncate(100) }}</p>
23                     </div>
24                     <div class="card-footer bg-transparent">
25                         <small class="text-muted">发布于 {{ post.created_at.strftime('%Y-%m-%d') }}</small>
26                     </div>
27                 </div>
28             </div>
29             {% else %}
30             <div class="col-12">
31                 <div class="alert alert-info">暂无文章,点击上方按钮创建第一篇</div>
32             </div>
33             {% endfor %}
34         </div>
35     </div>
36 
37     <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
38 </body>
39 </html>

Create.html如下

 1 <!DOCTYPE html>
 2 <html lang="zh-CN">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <title>新建文章 - 我的博客</title>
 7     <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
 8     <style>
 9         .form-container {
10             max-width: 800px;
11             margin: 2rem auto;
12             padding: 2rem;
13             background: white;
14             border-radius: 10px;
15             box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.1);
16         }
17         .form-title {
18             margin-bottom: 1.5rem;
19             padding-bottom: 0.5rem;
20             border-bottom: 1px solid #eee;
21         }
22         .form-control:focus {
23             border-color: #86b7fe;
24             box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
25         }
26     </style>
27 </head>
28 <body class="bg-light">
29     <div class="container py-5">
30         <div class="form-container">
31             <h2 class="form-title">撰写新文章</h2>
32             <form method="POST" action="/create">
33                 <div class="mb-3">
34                     <label for="title" class="form-label">文章标题</label>
35                     <input type="text" class="form-control" id="title" name="title" required>
36                 </div>
37                 <div class="mb-4">
38                     <label for="content" class="form-label">文章内容</label>
39                     <textarea class="form-control" id="content" name="content" rows="10" required></textarea>
40                 </div>
41                 <div class="d-flex justify-content-between">
42                     <a href="/" class="btn btn-outline-secondary">取消</a>
43                     <button type="submit" class="btn btn-primary">发布文章</button>
44                 </div>
45             </form>
46         </div>
47     </div>
48 
49     <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
50     <script>
51         // 自动聚焦标题输入框
52         document.addEventListener('DOMContentLoaded', function() {
53             document.getElementById('title').focus();
54         });
55     </script>
56 </body>
57 </html>

main.py代码如下

  1 # This is a sample Python script.
  2 from flask import Flask, render_template, request, redirect, url_for, jsonify
  3 from flask_sqlalchemy import SQLAlchemy
  4 from datetime import datetime
  5 import sqlite3
  6 import bcrypt
  7 from functools import wraps
  8 import os
  9 
 10 
 11 # Press Shift+F10 to execute it or replace it with your code.
 12 # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
 13 
 14 
 15 def print_hi(name):
 16     # Use a breakpoint in the code line below to debug your script.
 17     print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint.
 18     post_created_at = datetime.now()  # 实际应用中这里是从数据库获取的时间
 19 
 20 
 21 def init_database():
 22     # 连接数据库(不存在则自动创建)
 23     conn = sqlite3.connect('blog.db')
 24     cursor = conn.cursor()
 25 
 26     cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='users'")
 27     if cursor.fetchone():
 28         conn.close()
 29         print("数据库已存在,跳过初始化")
 30         return
 31 
 32     # 创建用户表
 33     cursor.execute('''CREATE TABLE IF NOT EXISTS users(
 34         id INTEGER PRIMARY KEY AUTOINCREMENT,
 35         username TEXT UNIQUE NOT NULL,
 36         password TEXT NOT NULL,
 37         created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
 38     )''')
 39 
 40     # 创建文章表
 41     cursor.execute('''CREATE TABLE IF NOT EXISTS posts(
 42         id INTEGER PRIMARY KEY AUTOINCREMENT,
 43         title TEXT NOT NULL,
 44         content TEXT NOT NULL,
 45         author_id INTEGER NOT NULL,
 46         created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
 47         FOREIGN KEY(author_id) REFERENCES users(id)
 48     )''')
 49 
 50     # 插入初始用户
 51     cursor.execute("INSERT OR IGNORE INTO users(username, password) VALUES (?,?)",
 52                    ('user1', 'securepassword123'))
 53 
 54     # 插入示例文章
 55     cursor.execute("INSERT INTO posts(title, content, author_id) VALUES (?,?,?)",
 56                    ('欢迎使用博客', '这是第一篇示例文章', 1))
 57 
 58     conn.commit()
 59     conn.close()
 60     print("数据库初始化完成")
 61 
 62 
 63 app = Flask(__name__)
 64 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
 65 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
 66 db = SQLAlchemy(app)
 67 
 68 
 69 class Post(db.Model):
 70     id = db.Column(db.Integer, primary_key=True)
 71     title = db.Column(db.String(100), nullable=False)
 72     content = db.Column(db.Text, nullable=False)
 73     created_at = db.Column(db.DateTime, default=datetime.now, nullable=False)
 74 
 75 
 76 @app.route('/')
 77 def index():
 78     posts = Post.query.order_by(Post.created_at.desc()).all()
 79     return render_template('index.html', posts=posts)
 80 
 81 
 82 @app.route('/create', methods=['GET', 'POST'])
 83 def create():
 84     if request.method == 'POST':
 85         title = request.form['title']
 86         content = request.form['content']
 87         new_post = Post(title=title, content=content)
 88         db.session.add(new_post)
 89         db.session.commit()
 90         return redirect(url_for('index'))
 91     return render_template('create.html')
 92 
 93 # Press the green button in the gutter to run the script.
 94 if __name__ == '__main__':
 95     print_hi('PyCharm')
 96     init_database()
 97     with app.app_context():
 98         db.create_all()
 99     app.run(host='0.0.0.0', port=5000)
100 
101 # See PyCharm help at https://www.jetbrains.com/help/pycharm/
102 # sudo apt-get update
103 # sudo apt-get install python3-pip
104 # sudo pip3 install virtualenv
105 # mkdir /var/www/flaskapp && cd /var/www/flaskapp
106 # virtualenv -p python3 venv
107 # source venv/bin/activate
108 # pip install flask gunicorn

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10 17

4.4终于把这道题调出来了啊/ll,不容易啊/ll 首先我写错的最大的点是 \(sum_x\) 把它也异或了 \(siz_x\) 次 其次是 op = 1 的 soltwo 的时候没有判 \(x = y\) 的情况 然后是 \(soltwo(x,y)\) \(x\) 往上的时候没有让…

深入解析:日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(2):语法 +考え方15+2022年7月N1

深入解析:日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(2):语法 +考え方15+2022年7月N12025-10-17 10:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: norma…

2025年铝单板厂家推荐排行榜,氟碳铝单板,木纹铝单板,冲孔铝单板,外墙铝单板,雕花铝单板,异形铝单板,双曲铝单板公司推荐!

2025年铝单板厂家推荐排行榜,氟碳铝单板,木纹铝单板,冲孔铝单板,外墙铝单板,雕花铝单板,异形铝单板,双曲铝单板公司推荐!行业背景与发展趋势铝单板作为现代建筑装饰材料的重要组成部分,近年来在建筑外立面、室…

2025 年最新推荐热熔胶源头厂家榜:覆盖书刊装订 / 包装等场景,助企业选高性价比产品

当前热熔胶应用广泛,却面临产品质量参差不齐、技术适配性不足、服务响应滞后等问题,下游企业在选购时常陷入困境,难以找到契合自身需求的高性价比源头厂家。为解决这一难题,帮助印刷、包装、鞋材等行业企业精准筛选…

开发日志

一个常用的工具:Mapster 进行一些对象属性复制的时候很方便。跟基础库里的DeepCopy配置起来使用。 配置文件的保存:目前基本上还是使用XML为主。 尝试了HASH,JSON,YAML,最终还是感觉XML使用总体体量更好。 XML,可…

Gitee 2025:中国开发者生态的崛起与本土化优势

Gitee 2025:中国开发者生态的崛起与本土化优势 在全球化与本土化交织的软件开发时代,中国开发者正面临一个关键选择:是继续依赖国际化的GitHub,还是拥抱更符合本土需求的Gitee?2025年的今天,这个答案已经变得清晰…

C++中的new操作符:new operator、operator new、placement new

new操作符(new operator) 当你写这种代码时: string *ps = new string("Memory Management"); 你使用的new是new操作符。 new操作符的动作包含两部分:在堆上为创建的对象申请内存 调用对象的构造函数进行…

JavaBean知识总结及范例

一、什么是 JavaBean? JavaBean 本质上是一个符合特定编码约定的 Java 类。它不是一个框架或技术,而是一种标准/规范。遵循这个规范的类,可以被特定的工具(如 IDE、Spring 框架等)更便捷地发现、使用和操作。二、…

C++20 协程的简单示例

C++20 协程的简单示例以下使用编译器版本为:gcc version 11.4.0 c++20 懒得介绍协程是什么,先直接贴一个最简单的例子:1 #include <iostream>2 #include <coroutine>3 #include <stdexcept>4 #in…

HMAC-SHA256 请求签名与验签实践(Python 可直接复用)

HMAC-SHA256 请求签名与验签实践(Python 可直接复用)目标:沉淀一套“能复制即用”的签名/验签规范与代码,解决接口防篡改与防伪造。 关键规则:待签名串:METHOD + "\n" + Content-MD5 + "\n"…

2025 年家装管道生产厂家最新推荐排行榜:覆盖云南昆明贵州贵阳四川成都重庆,精选优质 PPR/PVC 管道品牌,解决选购难题

在家装过程中,管道作为水电系统的核心部件,其质量直接决定居住安全与生活舒适度。当前家装管道市场混乱,部分厂商偷工减料,导致管道抗压差、易老化、密封性不足,漏水渗水问题频发,给业主带来巨大财产损失与生活困…

同一设备多账号登录,如何避免消息推送“串门”?

对各应用厂商而言,推送通知消息是App提高用户活跃度和转化率的高性价比营销工具。然而,当一个用户设备登录多个账号时,开发者可能会遇到同一条消息在同一设备的不同账号上重复展示的问题,这不仅降低了消息推送的精…

强合规行业DevOps选型:告别工具拼凑,找到真正适配的国产化DevOps方案

强合规行业DevOps平台选型需“建体系”,传统开源工具组合易陷数据割裂、合规难达标困境。本文对比三款DevOps产品,其中国产DevOps平台契合信创DevOps需求,内置合规卡点与追溯能力,适配国产化环境,助力企业平衡合规…

实用指南:精读 C++20 设计模式:行为型设计模式——观察者模式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

大疆无人机RTMP推流至LiveNVR实现web页面实时播放与录像回放,并可以转GB28181协议级联推送给上级监控视频管理平台

@目录1、无人机推流转国标2、获取RTMP推流地址2.1、RTMP推流地址格式2.2、推流地址示例2、设备RTMP推流3、配置拉转RTMP3.1、直播流地址格式3.2、直播流地地址示例3.3、通道配置直播流地址4、配置级联到GB28181国标平台…

Character Animator 2025下载安装教程:2D角色动画软件零基础入门,附最新下载安装教程及激活方法

还在找Character Animator 2025怎么下载安装?这份保姆级教程帮你一步到位!不管是做虚拟主播、短视频动画,还是教育课件制作,掌握CH 2025的安装方法是第一步。本文包含详细下载渠道、安装步骤、快捷键及常见问题,看…

2025年彩钢瓦/镀锌板/折弯件/C型钢/Z型钢/压型瓦/楼承板/次檩条厂家推荐排行榜,专业钢结构安装与定制加工实力解析

2025年彩钢瓦/镀锌板/折弯件/C型钢/Z型钢/压型瓦/楼承板/次檩条厂家推荐排行榜,专业钢结构安装与定制加工实力解析随着我国建筑工业化的快速发展,钢结构建筑因其施工周期短、抗震性能好、可回收利用等优势,在工业厂…

2025 年最新金相厂家最新推荐排行榜:涵盖金相磨抛机 / 切割机 / 显微镜 / 抛光机 / 预磨机设备,助力企业精准选择优质品牌

当前材料检测行业持续发展,金相检测作为材料分析核心环节,对石油机械、铁路器材、航空航天等领域的产品质量与安全起着关键作用。随着市场需求升级,金相品牌数量激增,但品牌间技术实力、产品质量和服务水平差距明显…

武汉图核科技

武汉图核科技新的名字 以前的名字是英语单词音译过来的,没有什么具体含义,也不容易看出是做什么的。中国人还是取个中文名好一些,于是想换个名字,要言简意赅,简单好记。不擅长取名,找AI来帮忙:一眼相中了图核科…

maven的概述以及在mac安装部署

maven的概述以及在mac安装部署pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…