# Flask Python 服务器部署

# 1. 准备服务器

首先,你需要一个可以运行 Python 的服务器。你可以使用以下服务:

  • 云服务提供商:如 AWS、阿里云、DigitalOcean 等。
  • VPS 提供商:如 Linode、Vultr 等。

确保服务器上安装了 Python 和 pip。

# 2. 连接到服务器

使用 SSH 连接到你的服务器:

ssh username@your_server_ip

# 3. 安装依赖

在服务器上,确保你已经安装了 Python 和 pip。你可以使用以下命令检查:

python3 --version pip3 --version

如果没有安装,可以使用以下命令安装:

sudo apt update sudo apt install python3 python3-pip

# 4. 上传代码

将你的 Flask 应用代码上传到服务器。可以使用 SCP、FTP 或 Git 来上传文件。下面是使用 SCP 的示例:

scp -r /path/to/your/project username@your_server_ip:/path/to/target/directory

# 5. 创建虚拟环境

在你的项目目录中创建一个虚拟环境:

cd /path/to/target/directory python3 -m venv venv source venv/bin/activate

# 6. 安装项目依赖

在虚拟环境中安装你的项目依赖:

pip install -r requirements.txt

# 7. 运行 Flask 应用

在开发环境中,你可以使用以下命令运行 Flask 应用:

python app.py

但是在生产环境中,最好使用 WSGI 服务器(如 Gunicorn)来运行 Flask 应用:

pip install gunicorn gunicorn -w 4 app:app --bind 0.0.0.0:5000

这里 -w 4 表示使用 4 个工作进程,你可以根据需要调整。

# 8. 配置反向代理(可选)

为了在 80 或 443 端口上提供服务,建议使用 Nginx 作为反向代理:

# 安装 Nginx

sudo apt install nginx

# 配置 Nginx

创建一个新的 Nginx 配置文件,例如 /etc/nginx/sites-available/my_flask_app

nginx

复制代码

server { listen 80; server_name your_server_ip; # 或者你的域名 location / { proxy_pass http://127.0.0.1:5000; # Flask 应用的地址 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; } }

创建符号链接到 sites-enabled

sudo ln -s /etc/nginx/sites-available/my_flask_app /etc/nginx/sites-enabled

测试 Nginx 配置并重启服务:

sudo nginx -t sudo systemctl restart nginx

# 9. 配置防火墙(可选)

确保服务器的防火墙允许 HTTP 和 HTTPS 流量:

sudo ufw allow 'Nginx Full'

# 10. 访问你的应用

现在,你应该能够通过浏览器访问你的 Flask 应用,使用服务器的 IP 地址或域名。

# 额外建议

  • 使用 HTTPS:在生产环境中,强烈建议使用 HTTPS。可以使用 Let’s Encrypt 来免费申请 SSL 证书。
  • 监控和日志:考虑使用工具来监控应用的性能和日志,以便及时发现问题。

# python

好的,这里是一个详细的 Python 方案,包括登录页面、选择文件夹、处理 PDF 文件并将数据存储到 SQLite 数据库,以及在线更新功能。

# 1. 环境配置和库安装

1
pip install PyInstaller PyUpdater PyPDF2 pdfminer.six pymupdf tkinter requests

# 2. 登录页面和主程序逻辑

# 2.1. 创建登录界面

创建一个文件 login.py 用于实现登录界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import tkinter as tk
from tkinter import messagebox
import requests

class LoginApp:
def __init__(self, root):
self.root = root
self.root.title("登录")
self.root.geometry("300x150")

self.username_label = tk.Label(root, text="用户名")
self.username_label.pack()
self.username_entry = tk.Entry(root)
self.username_entry.pack()

self.password_label = tk.Label(root, text="密码")
self.password_label.pack()
self.password_entry = tk.Entry(root, show="*")
self.password_entry.pack()

self.login_button = tk.Button(root, text="登录", command=self.login)
self.login_button.pack()

def login(self):
username = self.username_entry.get()
password = self.password_entry.get()
# 假设存在一个登录接口
login_url = "http://example.com/api/login"
response = requests.post(login_url, json={"username": username, "password": password})

if response.status_code == 200 and response.json().get("status") == "success":
messagebox.showinfo("成功", "登录成功")
self.root.destroy()
import main
main.run_app()
else:
messagebox.showerror("错误", "用户名或密码错误")

def run_login_app():
root = tk.Tk()
app = LoginApp(root)
root.mainloop()

# 2.2. 主程序逻辑

创建 main.py 实现主程序逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import os
import fitz # PyMuPDF
import sqlite3
import tkinter as tk
from tkinter import filedialog, messagebox

def select_folder():
folder_path = filedialog.askdirectory(title="选择包含PDF文件的文件夹")
return folder_path

def extract_text_from_pdf(pdf_path):
doc = fitz.open(pdf_path)
text = ""
for page in doc:
text += page.get_text()
return text

def store_data_to_db(data):
conn = sqlite3.connect('extracted_data.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS pdf_data
(id INTEGER PRIMARY KEY, file_name TEXT, content TEXT)''')
cursor.execute('INSERT INTO pdf_data (file_name, content) VALUES (?, ?)', data)
conn.commit()
conn.close()

def process_pdfs(folder_path):
for file_name in os.listdir(folder_path):
if file_name.endswith('.pdf'):
pdf_path = os.path.join(folder_path, file_name)
text = extract_text_from_pdf(pdf_path)
store_data_to_db((file_name, text))
messagebox.showinfo("处理完成", f"文件 {file_name} 处理完成")

def run_app():
root = tk.Tk()
root.withdraw()
folder_path = select_folder()
if folder_path:
process_pdfs(folder_path)
else:
messagebox.showinfo("提示", "没有选择文件夹")

if __name__ == "__main__":
run_login_app()

# 2.3. 在线更新功能

创建 client_config.py 配置 PyUpdater:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import os
from pyupdater.client import Client

APP_NAME = "PDFExtractorApp"
APP_VERSION = "0.1.0"
UPDATE_URLS = ['http://your-update-server.com/']

class ClientConfig:
PUBLIC_KEY = "your-public-key"
APP_NAME = APP_NAME
COMPANY_NAME = "YourCompany"
UPDATE_URLS = UPDATE_URLS
MAX_DOWNLOAD_RETRIES = 3
USE_PATCHES = True

def check_for_updates():
client = Client(ClientConfig(), refresh=True)
app_update = client.update_check(ClientConfig.APP_NAME, ClientConfig.APP_VERSION)
if app_update is not None:
app_update.download()
if app_update.is_downloaded():
app_update.extract_restart()

main.pyrun_app 函数中加入更新检查:

1
2
3
4
5
6
7
8
9
10
11
def run_app():
from client_config import check_for_updates
check_for_updates()

root = tk.Tk()
root.withdraw()
folder_path = select_folder()
if folder_path:
process_pdfs(folder_path)
else:
messagebox.showinfo("提示", "没有选择文件夹")

# 2.4. 打包应用程序

创建一个 spec 文件来配置打包设置( your_script.spec ):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# your_script.spec
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['main.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)

pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)

exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='PDFExtractorApp',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False)

coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='PDFExtractorApp')

然后使用 pyinstaller 打包:

1
pyinstaller your_script.spec

# 3. 配置和初始化 PyUpdater

1
2
3
4
5
6
pyupdater init
pyupdater pkg --process
pyupdater pkg --sign
pyupdater pkg --upload
pyupdater keys --create
pyupdater settings

# 4. 部署和测试

将生成的可执行文件和更新配置上传到你的服务器。然后运行打包好的应用程序,确保登录功能、PDF 处理功能和在线更新功能都正常工作。

这样,你就有了一个带有登录功能的 Windows 应用程序,可以选择文件夹中的 PDF 文件进行处理,并支持在线更新。

# 要读取多个 Excel 文件并两两判断它们之间是否存在高度重复的数据,可以按以下步骤进行

  1. 读取所有 Excel 文件
  2. 提取并整理数据
  3. 比较每对 Excel 文件的数据
  4. 计算重复率
  5. 输出比较结果

可以使用 pandas 库来处理 Excel 文件,利用 pandas 的 DataFrame 结构进行数据比较和重复率计算。

# 1. 安装必要的库

首先,确保你已经安装了 pandasopenpyxl 库:

bash

复制代码

pip install pandas openpyxl

# 2. 读取所有 Excel 文件

使用 pandas 读取 Excel 文件,并提取数据。

python

复制代码

import os import pandas as pd def read_excel_files(folder_path): excel_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx')] dataframes = {f: pd.read_excel(f) for f in excel_files} return dataframes folder_path = 'your_folder_with_excel_files' dataframes = read_excel_files(folder_path)

# 3. 比较每对 Excel 文件的数据

定义一个函数来比较两个 DataFrame,计算重复率。

python

复制代码

def calculate_similarity(df1, df2): # 确保两者都有相同的列 common_columns = df1.columns.intersection(df2.columns) if len(common_columns) == 0: return 0.0 # 选择共同的列进行比较 df1_common = df1[common_columns] df2_common = df2[common_columns] # 合并两个数据集,保留重复项 combined = pd.concat([df1_common, df2_common]) duplicates = combined.duplicated(keep=False) # 计算重复率 similarity = duplicates.sum() / len(combined) return similarity def compare_excel_files(dataframes): results = [] files = list(dataframes.keys()) for i in range(len(files)): for j in range(i + 1, len(files)): df1 = dataframes[files[i]] df2 = dataframes[files[j]] similarity = calculate_similarity(df1, df2) results.append((files[i], files[j], similarity)) return results similarity_results = compare_excel_files(dataframes)

# 4. 输出比较结果

将比较结果输出,显示每对 Excel 文件的相似度。

python

复制代码

for file1, file2, similarity in similarity_results: print(f"文件 {file1} 和文件 {file2} 的相似度为: {similarity:.2%}")

# 完整代码

python

复制代码

import os import pandas as pd def read_excel_files(folder_path): excel_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx')] dataframes = {f: pd.read_excel(f) for f in excel_files} return dataframes def calculate_similarity(df1, df2): common_columns = df1.columns.intersection(df2.columns) if len(common_columns) == 0: return 0.0 df1_common = df1[common_columns] df2_common = df2[common_columns] combined = pd.concat([df1_common, df2_common]) duplicates = combined.duplicated(keep=False) similarity = duplicates.sum() / len(combined) return similarity def compare_excel_files(dataframes): results = [] files = list(dataframes.keys()) for i in range(len(files)): for j in range(i + 1, len(files)): df1 = dataframes[files[i]] df2 = dataframes[files[j]] similarity = calculate_similarity(df1, df2) results.append((files[i], files[j], similarity)) return results folder_path = 'your_folder_with_excel_files' dataframes = read_excel_files(folder_path) similarity_results = compare_excel_files(dataframes) for file1, file2, similarity in similarity_results: print(f"文件 {file1} 和文件 {file2} 的相似度为: {similarity:.2%}")

# 注意事项

  • 列对齐:确保所有比较的数据具有相同的列。
  • 数据清理:在实际使用中,可能需要对数据进行清理和预处理,以确保比较的准确性。
  • 优化:对于大型数据集,计算重复率可能会很耗时。可以考虑优化算法或使用更高效的数据结构。

通过这些步骤,你可以实现读取多个 Excel 文件并两两判断是否有高度重复的数据,并计算和输出相似度。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

有李说不清 微信支付

微信支付

有李说不清 支付宝

支付宝

有李说不清 贝宝

贝宝