我有一个 GitHub 存储库,其中在存储库的根目录下包含一个用于前端的
client
文件夹和一个用于后端的 server
文件夹。我们正在同一应用程序服务计划中将这两个文件夹分别部署到它们自己的 azure Web 应用程序中。我有一个 github action yaml 文件,它将 server
文件夹的内容部署到 Web 应用程序,但我们想在 python 后端使用绝对导入(pylint 和其他一些东西似乎喜欢这样),所以我们所有的导入看起来像 from server.module import something
,它在 azure 上失败,因为没有 server
文件夹,并且 module
文件夹放置在 Web 应用服务器上的默认根文件夹中。如果我们将导入更改为 from module import something
一切正常。
将此 python 应用程序部署到 Web 应用程序同时仍然能够使用绝对导入的最佳方法是什么?我假设如果我们可以将所有内容放入
server
文件夹中并更改启动命令以反映 app.py
的新路径,一切都会起作用,但事实证明,执行此操作很困难一直是一个问题。这就是我的 github 操作 yaml 当前的样子:
on:
push:
branches:
- beta
paths:
- 'server/**'
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python version
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Create and start virtual environment
run: |
python -m venv venv
source venv/bin/activate
working-directory: ./server
- name: Install dependencies
run: pip install -r requirements.txt
working-directory: ./server
# Optional: Add step to run tests here (PyTest, Django test suites, etc.)
- name: Upload artifact for deployment jobs
uses: actions/upload-artifact@v4
with:
name: python-app
path: |
./server
!venv/
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: python-app
path: ./server
- name: Deploy web App using GH Action azure/webapps-deploy
uses: azure/webapps-deploy@v3
with:
app-name: <our_app_name>
slot-name: 'production'
publish-profile: ${{ secrets.BACKEND_PUBLISH_PROFILE }}
package: ./server```
我使用 python 和客户端应用程序创建了简单的服务器应用程序,并通过 GitHub 存储库部署到 Azure Web 应用程序。
下面是完整的项目结构和服务器文件夹,其中包含所有必需的文件,如下所示。
下面是部署特定文件夹的完整 yml。
GitHub/工作流程文件:
name: Build and deploy Python app to Azure Web App - kapythonapp
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python version
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Create and start virtual environment
run: |
python -m venv venv
source venv/bin/activate
working-directory: ./server
- name: Install dependencies
run: pip install -r requirements.txt
working-directory: ./server
- name: Upload artifact for deployment jobs
uses: actions/upload-artifact@v4
with:
name: python-app
path: |
./server
!venv/
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: python-app
path: ./server
- name: 'Deploy to Azure Web App'
uses: azure/webapps-deploy@v3
id: deploy-to-webapp
with:
app-name: 'kapythonapp'
slot-name: 'Production'
publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_B14CED35610D45228B59B7BBAD16C953 }}
package: ./server
我在应用程序中使用了
from server.module import something
。 py 文件,部署后出现以下错误。
ModuleNotFoundError: No module named 'server'
部署到 Azure Web Apps 时,
server
文件夹的内容直接部署到 site/wwwroot
文件夹,而不是位于 site/wwwroot/server
下。
默认情况下,Azure Web Apps 将应用程序的内容部署到 wwwroot
目录,该目录充当应用程序的根文件夹。 结果,路径
server.module
不再存在。如果您的
module
文件夹位于
server
文件夹中并且服务器文件夹是根目录。你不需要定义
server.module
.所以
from module import something
可以工作,因为
module folder
位于已部署应用程序的根目录中。您可以使用以下 URL 在 kudu 控制台中检查已部署的文件。
https://<AzureWebAppName>.scm.canadacentral-01.azurewebsites.net/newui
我下载了output.tar.gz
文件夹。
它仅包含服务器文件的内容。
输出:
请参阅此
Msdoc 了解绝对导入。