from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello Python!'
if __name__ == '__main__':
app.run(port=8080)
初始化应用:从 flask 模块导入 Flask 类,并创建一个 Flask 应用的实例
定义路由:
路由是 URL 到 Python 函数的映射。这些函数被称为视图函数。视图函数负责响应来自浏览器或其他客户端的请求,并且返回客户端需要的内容。
使用装饰器 @app.route() 来为这些视图函数定义路由。装饰器接受一个路径作为参数(例如 ‘/’ 是应用的根地址),并且可以通过 methods 参数来指定允许的 HTTP 请求方法,如 ‘GET’, ‘POST’ 等。
启动应用:通过调用 app.run() 方法来启动 Flask 应用。port 参数用于指定服务器监听的端口号。
host参数用于指定接受网络接口上的连接请求,当设置为127.0.0.1或localhost时,服务器只会接受在本机上发起的连接请求。设置为0.0.0.0时,服务器将接受所有网络接口上的连接请求,无论是来自本地机器还是网络中的其他机器。当设置为host=',服务器只会接受通过该特定IP地址发起的连接请求。
调试模式(debug):
app.run(host=‘0.0.0.0’, port=8080, debug=True):这行代码通过debug=True开启了调试模式。在调试模式下,如果代码发生变化,服务器将会自动重启,同时,如果应用抛出错误,你将在浏览器中看到详细的错误信息,这对于开发和调试应用非常有帮助。
app.run(port=8080):这行代码没有明确开启调试模式。如果没有在其他地方(如应用配置中)开启调试模式,那么应用将以生产模式运行,这意味着不会自动重启,也不会显示详细的错误信息。
debug省流就是你修改代码程序实时更新,不需要停止再重新运行,因为服务器将会自动重启
name 在 Python 中是一个内置变量,它代表当前模块的名称。当 Python 文件被直接运行时,name 的值被设置为 “main”。
代表是:
if __name__ == '__main__':
app.run(port=8080)
但是,如果这个文件被另一个文件导入为模块,name 的值则会被设置为该文件(或说模块)的名称,__name__就是代表这个文件。
代表是:
import app
在 Flask 中使用 app = Flask(__name__)
这种方式创建应用实例时,__name__
的使用更多地是为了确定应用的启动方式和位置,而不仅仅是“代表这个文件”。
当你执行 app.py 文件时,name 的值是 ‘main’,Flask 可以从模块(文件)的位置推断出应用的根目录。它实际上是获取了当前文件(在这个例子中是 app.py)的位置作为应用的根目录。
运行方式就是判断你是直接运行还是作为模块。
最简版本:
初始化应用:从 flask 模块导入 Flask 类,并创建一个 Flask 应用的实例
from flask import Flask
app = Flask(__name__)
定义路由:装饰器 @app.route() ,一个路径作为参数,methods 参数来指定允许的 HTTP 请求方法,一个视图函数
@app.route('/', methods=['GET'])
def hello():
return 'Hello Python!'
监听端口:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
ps:路由是 URL 到 Python 函数的映射。这些函数被称为视图函数。
import requests
headers = {
'Content-Type': 'application/json',
}
json_data = {
'model': 'gpt-3.5-turbo',
'messages': [
{
'role': 'user',
'content': 'hi',
},
],
'stream': True,
}
response = requests.post('http://你的服务器ip:8080/v1/chat/completions', headers=headers, json=json_data)
print(response.text)
Flask版本:
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
@app.route('/send-request', methods=['POST'])
def send_request():
# 从请求体中获取用户的问题
user_data = request.json
user_question = user_data.get('question', 'hi') # 如果没有提供问题,默认使用'hi'
headers = {
'Content-Type': 'application/json',
}
json_data = {
'model': 'gpt-3.5-turbo',
'messages': [
{
'role': 'user',
'content': user_question, # 使用用户的问题
},
],
'stream': True,
}
response = requests.post('http://你的服务器ip:8080/v1/chat/completions', headers=headers, json=json_data)
# 返回响应文本
return response.text
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
serv00提供FreeBSD系统动态的选择端口:
def find_available_port():
# 定义一个起始端口号
start_port = 1024
# 循环直到找到一个未被占用的端口
while True:
try:
# 创建一个套接字并尝试绑定到指定端口
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('127.0.0.1', start_port))
return start_port
except OSError:
# 如果端口已被占用,则尝试下一个端口
start_port += 1
if __name__ == '__main__':
# 动态选择可用端口
port = find_available_port()
print(f"Using port: {port}")
# 启动 Flask 应用程序
app.run(host='0.0.0.0', port=port, debug=True)
普通的动态选择端口:
def find_free_port():
"""找到一个可用的端口"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 0)) # 绑定到一个空闲的端口
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
return s.getsockname()[1]
if __name__ == '__main__':
free_port = find_free_port()
app.run(host='0.0.0.0', port=free_port, debug=True)
def find_available_port():
# 定义一个起始端口号
start_port = 1024
# 循环直到找到一个未被占用的端口
while True:
try:
# 创建一个套接字并尝试绑定到指定端口
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('127.0.0.1', start_port))
return start_port
except OSError:
# 如果端口已被占用,则尝试下一个端口
start_port += 1
这个之所以不会遇到权限问题,是因为他尝试绑定端口,报错就会到下一个端口,直到遇到申请好的端口
而这个是有空闲就绑定,但是我的系统是FreeBSD系统,是serv00提供的,没有root权限,也没有sudo,而且需要提前申请端口,没有申请,即使是空闲的,也会报错没有权限
def find_free_port():
"""找到一个可用的端口"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 0)) # 绑定到一个空闲的端口
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
return s.getsockname()[1]