避坑指南:当你将 Django 项目部署到 Heroku 你需要避多少坑?

news2024/11/14 15:42:45

文章目录

  • Cors 跨域问题
    • localhost 阶段
    • Heroku 部署阶段
  • Procfile 启动文件
  • Database 数据库相关内容
    • localhost 阶段
    • Heroku 部署阶段
      • settings.py 中 正确的设置方式
      • 官方给出的 settings.py
    • makemigration & migrate 数据迁移
  • requirements.txt & runtime.txt 版本和库
  • 总结

Cors 跨域问题

  • 跨域资源共享(Cross-Origin Resource Sharing,CORS)问题可能在本地开发阶段和 Heroku 部署阶段都会出现,具体情况如下:

  • 本地开发阶段的 CORS 问题:

    • 当你在本地运行你的前端应用(例如Vue.js或React应用)和后端服务(例如Django或Node.js服务器)在不同的端口上时,就可能会遇到CORS问题。浏览器基于安全原因实施了同源策略,这意味着来自一个源(协议、域名和端口都相同)的JavaScript只能获取该源上的资源。如果尝试获取不同源的资源,就会出现CORS错误。

    • 例如,假设你的前端应用运行在localhost:3000,而你的后端服务运行在localhost:8000,那么从前端应用发送到后端服务的请求将被视为跨源请求。

  • Heroku部署阶段的CORS问题:

    • 在部署到Heroku或其他任何生产环境后,你的前端应用和后端服务可能会托管在不同的域上。例如,你的前端应用可能托管在Netlify或Vercel上(例如 https://your-frontend.netlify.app),而你的后端服务则托管在Heroku上(例如 https://your-backend.herokuapp.com)。在这种情况下,你的前端应用向后端服务发送的所有请求都将被视为跨源请求。
    • 或者当你的后端代码已经在 heroku 上完成部署,但是前端代码还在 local,那么前端请求后端依然存在 CORS 问题
    • 要解决这些问题,你需要配置你的后端服务以允许来自你的前端应用的跨源请求。在Django中,你可以使用django-cors-headers包来完成此操作。
  • 下面我会分别介绍不同阶段的跨域问题的解决方案

localhost 阶段

  • 解决跨域问题的根本思路是使用 CORS header, 当然在本地开发的时候我们可以不去设置 CORS headers,而是简单的在每个可能发生 Cors 问题的函数上面加个修饰符号 @csrf_exempt,如下:
    在这里插入图片描述

  • 这样在调试的时候可以很方便

  • 在Django中,@csrf_exempt 是一个装饰器,可以用于特定的视图函数上,以使得该函数免除CSRF保护。当你使用 @csrf_exempt 装饰一个视图函数时,这个函数会被排除在CSRF保护之外。也就是说,对这个函数的POST请求将不需要携带CSRF token

  • 以下是如何使用@csrf_exempt的例子:

    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt
    def my_view(request):
    	pass
    
  • 再次强调,虽然这种在本地有用,但是当你真的部署服务器的时候,还是需要解决跨域问题

Heroku 部署阶段

  • 这时候还是安安稳稳地去改 header 吧,下面是具体方法:
  1. 安装django-cors-headers库:

    pip install django-cors-headers
    
  2. 将它添加到你的settings.pyINSTALLED_APPS中:

    INSTALLED_APPS = [
        ...
        'corsheaders',
        ...
    ]
    
  3. settings.pyMIDDLEWARE中,将 CorsMiddleware 添加到顶部

    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',
        ...
    ]
    
  4. 然后你需要在你的设置中添加以下设置:

    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',
        ...
    ]
    

Procfile 启动文件

  • Procfile是 Heroku 用来知道如何运行你的应用的一种文件。在这个文件中,你定义了应用的各种进程类型以及这些进程对应的命令。

  • 这个文件没有后缀,不要自己加任何后缀,如果你是 macos 请注意不要让系统默认给你加 .txt 结尾

  • 例如,一个典型的Django应用的 Procfile 可能看起来像这样:

    web: gunicorn YOUR_PROJECT_NAME.wsgi
    
  • 除此之外,Procfile也可以包含 release 进程类型,该进程类型是每次部署新版本的应用时运行的进程。例如,你可以使用 release 进程来运行数据库迁移,这个我们后面会提到。

  • 总的来说,Procfile 是告诉Heroku如何运行你的应用的重要文件,包括启动哪些进程以及如何启动它们。

Database 数据库相关内容

localhost 阶段

django.db.utils.OperationalError: no such table: nnsh_backend_new_roommember
  • nnsh_backend_new_roommember。这个问题可能是由以下原因引起的:

    • 模型没有迁移: 当你在 Django 中创建一个新的模型或者改变现有的模型时,你需要创建一个迁移文件(通过 python manage.py makemigrations)然后应用这个迁移(通过 python manage.py migrate)。如果你没有应用迁移,数据库表将不会被创建。

    • 数据库未同步: 如果你的数据库未与你的代码同步,那么可能会出现这个问题。例如,如果你在开发环境中创建并迁移了数据库,但在生产环境中没有做同样的操作。

    • 错误的数据库设置: 在 Django 的 settings.py 文件中,你需要为 DATABASES 设置正确的值,包括数据库引擎,数据库名,用户,密码等。

  • 于是我尝试:

    python manage.py makemigrations
    python manage.py migrate
    
  • 但是没用,经过一番探索,使用下面的命令:

    	python manage.py makemigrations YOUR_PROJECT_NAME
    	python manage.py migrate
    

    在这里插入图片描述

  • 所以修改后的命令是:

    	python manage.py makemigrations nnsh_backend_new
    	python manage.py migrate
    

Heroku 部署阶段

在部署阶段,数据库要面对几个重要的问题

settings.py 中 正确的设置方式

  • 在部署 Heroku 的时候,官网提供了一份 settings.py 的 模板 供我们参考
  • 这个 settings.pyDataset 部分的定义如下:
    在这里插入图片描述

官方给出的 settings.py

  • 上面展示的是我修改后的代码,但是 settings.py 给的示例如下:
    在这里插入图片描述

  • 可以看出,官方给出的 settings.py 关于 Database 部分并没有给完整的描述,这就造成了一个问题,也就是我一开始将代码部署到 Heroku 的时候,总是报有关于数据库的错误,其中有效的错误信息为:

    django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
    
  • 这表明 Django 在尝试执行数据库操作时无法找到有效的数据库引擎配置。但是我已经按照官方提供的 setting 去设置我的 Database,于是我想,是不是 heroku 的数据库跟 local 部署有很大差异,需要人为提前设定,并且配置。

  • 经过证实,确实如此。当你将包含数据库的Django应用部署到Heroku上时,你需要在Heroku上设置数据库。如果你希望使用 Heroku 的Postgres服务,可以在Heroku的 app settings 中添加 Heroku Postgres 附加组件。这会自动创建一个新的PostgreSQL数据库,并将连接信息存储在DATABASE_URL环境变量中。

  • 手动设置这个数据库的方式就是:Overview->Config Add-ons
    在这里插入图片描述

  • 搜索 heroku postgres 然后添加上就行
    在这里插入图片描述

  • 一旦你添加了数据库,Heroku会自动设置一个环境变量 DATABASE_URL,其中包含了连接到你新的 Heroku Postgres 数据库所需的所有信息。

  • 接着在 settings.py 中按照我的方式加上那一行
    在这里插入图片描述

  • 上面的代码的作用是读取环境变量(Heroku会自动设置)中的数据库URL,并用它去配置Django的 DATABASES 设置。

makemigration & migrate 数据迁移

  • 到这里还没完,因为我们在 Heroku 上设置了我们的数据库,并且在 settings 中配置了,接下来跟在本地一样,我们同样也要对数据进行迁移,也就是 migration 操作

  • 这个部分我们需要在整个 application 开始之前完成,而 application 的启动基于我们的 Procfile 文件中的 web: gunicorn YOUR_PROJECT_NAME.wsgi,因此在这个句子之前我们需要率先完成 migration

  • 所以我们将 Procfile 加上一句话:

    release: python manage.py makemigrations YOUR_PROJECT_NAME && python manage.py migrate
    web: gunicorn YOUR_PROJECT_NAME.wsgi
    
  • 一定要注意 YOUR_PROJECT_NAME 的部分一定要用自己的项目的名称,别弄错了哦~

requirements.txt & runtime.txt 版本和库

  • requirements.txt 文件中预先写好所有的 heroku 部署需要使用的 package 的版本信息
  • runtime.txt 文件则是指定 python 使用的版本,因为 heroku 本身支持的 python 版本并不多,一定弄清楚 heroku 可以支持的 python 版本再下手,详情可以看我另一篇关于 heroku 的文章
  • 一定注意 requirements.txt 一定要多次检查,保证重要的 package 都写进去了,如果遗漏 debug 的时候很费劲,尤其是几个特别重要的:
    Diango==4.0.1
    gunicorn==20.1.0
    diango-heroku==0.3.1
    

总结

  1. 跨域问题,用 cors header 解决,要对应修改 settings.py 中的部分
  2. Procfile 注意没有后缀,是部署的程序启动文件,也可以负责 heroku 端数据库的迁移操作
  3. requirments.txt 一定写全,runtime.txt 指定好 python 版本
  4. settings.py 跟着官网指导的写,但是注意数据库部分的定义;同时记得首先在 heroku 的 Overview 中把 Postgres 数据库手动设置好,要不然数据库调用失败

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

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

相关文章

如何记录程序运行时间

使用c标准库中时钟类来实现。 使用模板类&#xff1a; chrono::duration<int,ratio<1,2>(20)>前面的int限定了延时单位是一个整数。只要1小时&#xff0c;2小时&#xff0c;但是没有1.5小时。ratio<1,2>代表一个分数。后面的2代表分母&#xff0c;前面的1为分…

Keil5中写的软件延时函数不起作用现象解析_ARM_Compiler_volatile关键字

一、问题描述 在学习野火霸天虎F407寄存器点亮LED时&#xff0c;出现实验现象&#xff1a;LED灯不亮&#xff0c;野火霸天虎F407资料。 main.c代码如下&#xff1a; #include "stm32f4xx.h"void Delay(unsigned int count);int main(void) { #if 0/* 第一步&a…

Axure教程——循环倒计时

本文介绍的是用Axure制作的循环倒计时 效果 预览&#xff1a;https://zhgcck.axshare.com 功能 1、点击“开始”按钮&#xff0c;倒计时开始 2、数值到1时&#xff0c;从10重新倒计时 制作 一、需要的元件 矩形、动态面板 二、制作过程 拖入一个动态面板&#xff0c;命名为…

gnuplot 命令行绘图工具命令

gnuplot命令行绘图工具命令 绘图示例预览 gnuplot工具非常强大&#xff0c;可以在命令行进行曲线绘图&#xff0c;当然也可以在UI界面绘图。 绘图命令&#xff1a; gnuplot> plot test.csv u ($0):1 w lp t c1, test.csv u ($0):2 w lp t c2绘图效果&#xff1a; 数据文…

CSDN 成长记

博客之星入围排行榜 - 2023.5.7 博文 PaddleVideo 简介以及文件目录详解 - 入选内容榜咯 - 2023.5.9 付费专栏 微机系统与接口上机实验_TD PITE型 终于开张咯 - 2023.5.15 博文 ResNet 论文理解含视频 - 入选内容榜第13名 - 2023.5.16 博文 ResNet 论文理解含视频 - 入选全站综…

4.设计模式之后七种模式后11种模式命令访问者迭代器发布订阅中介者忘备录解释器状态策略职责链和空模式

1.命令(command)模式 不知道命令接收者(对象)是谁,支持撤销 (接受者 间接调用执行 的具体行为) 命令调用者和接收者解耦 //只要实现命令接口即可 (就是客户端给个命令,然后命令类传给接收类执行) 优点和缺点 容易撤销操作 命令队列可以多线程操作 增加过多的命令类 空命令也是一…

关于credal set和credal decision tree的一点思考(其实就是论文笔记)

阅读Abelln老师的Credal-C4.5时&#xff0c;发现好难。。。然后又额外补充了一些论文&#xff0c;终于稍微懂一点点了&#xff0c;所以记录如下。 credal set在DS theory的定义如下 [1]&#xff1a; 这句话的意思是&#xff08;证据理论中的&#xff09;credal set是一个概率…

Web安全-Behinder(冰蝎)Webshell管理工具使用

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 工具下载地址02 运行环境03 工具介绍04 使用案例 01 工具下载地址 https://github.com/rebeyond/Behinder点击页面右侧"releases"&#xff0c;进入工具的版本下载页面。 在个人终端安…

经典软件工程复兴?大模型驱动的软件工程实践标准化

TL&#xff1b;DR。 简单来说&#xff0c;本文探讨了大模型驱动的软件工程实践标准化&#xff0c;以及如何将需求和设计规范化为 DSL 格式。通过这种方式&#xff0c;可以让 AI 更自动化、高效地编写代码。 随着大语言模型在软件开发中的应用越来越广泛&#xff0c;传统的软件工…

sourcetree中添加秘钥 - 工具篇

文章目录 1. 首先配置秘钥2. 打开sourcetree 1. 首先配置秘钥 参考文章&#xff1a;https://blog.csdn.net/qq_40968685/article/details/131328007 2. 打开sourcetree 打开“选项” 然后&#xff0c;从gitlab中复制ssh地址到sourcetree中&#xff0c;会看到如图提示&…

【python】ndarray的广播功能

目录 0.环境 1.背景简介 2.ndarray的广播功能 2.1概念 2.2意义 2.3使用前提 2.4举例 2.5完整代码 0.环境 windows jupyter notebook验证代码 1.背景简介 我是在查询【ndarray和array的区别】时&#xff0c;看到了“广播功能”这个词&#xff0c;之前只在网络的相关定义…

分布式版本控制系统Git介绍

Git 是一款开源的分布式版本控制系统&#xff0c;具备分布式、轻量级分支、强大的协作能力以及适用于大小项目的版本管理。本文简要介绍Git工具的特性、Git中的对象以及分支管理&#xff0c;以加深了解。 1、版本控制系统介绍 版本控制是指对软件开发过程中各种程序代码、配置…

Docker是什么以及docker的常用命令

Docker简介 Docker是一种开源的容器化平台&#xff0c;用于构建、部署和运行应用程序。它允许开发人员将应用程序及其所有依赖项打包到一个称为"容器"的独立单元中。这个容器可以在任何支持Docker的环境中运行&#xff0c;无论是开发人员的本地机器、虚拟机还是云服务…

Bert

参考资料&#xff1a; 《机器学习》李宏毅 1 Bert 是怎么运作的&#xff1f; Bert 是一种自监督学习&#xff08;Self-supervised Learning&#xff09;模型。Bert 的目标是 pre-train 出一个能够理解语义的多功能语言模型&#xff0c;使之能够在特定任务上只学习较少的带标…

快速上手 vercel,手把手教你白嫖部署上线你的个人项目

壹 ❀ 关于 vercel Vercel 是一个云服务平台&#xff0c;支持静态网站&#xff08;纯静态页面&#xff0c;比如现在base utils 文档也是基于vercel&#xff09;和动态网站的应用部署、预览和上线。如果你用过 GitHub Pages &#xff0c;那么心里可能不会太陌生&#xff0c;但你…

Web3 在Truffle项目中编写出自己的第一个solidity智能合约

好 上文Web3本地搭建truffle智能合约开发环境我们在本地搭起了一个 Truffle 项目 然后 我们说明项目中文件的用途 然后 我们还是通过ganache模拟一个本地的区块链环境 然后打开我们搭建的Truffle项目 首先 我们第一个要看的肯定是truffle-config.js 肯定要先配好连接的环境 我…

UDP 协议【传输层协议】

文章目录 1. 传输层1.1 TCP 与 UDP 2. 端口号2.1 端口号标识进程2.2 通过IP地址、端口号、协议号进行通信识别2.3 协议号2.4 端口号的范围2.5 常用命令netstatiostatpidof 2.6 存疑 3. UDP 协议3.1 地位3.2 报头的分离和交付3.3 UDP 报文的格式3.4 UDP 数据封装和分用数据封装数…

rk3288中apk串口打开失败,selinux权限问题

apk打开串口失败 报错信息&#xff1a; 07-03 17:05:27.030 4582 4582 W jw.ComAssistant: type1400 audit(0.0:56): avc: denied { read } for name"ttyS2" dev"tmpfs" ino7704 scontextu:r:untrusted_app:s0:c512,c768 tcontextu:object_r:ttyS2_dev…

《YOLOv8魔术师》专栏介绍 CSDN独家改进创新实战专栏目录

&#x1f4a1;&#x1f4a1;&#x1f4a1;Yolov8魔术师&#xff0c;独家首发创新&#xff08;原创&#xff09;&#xff0c;持续更新&#xff0c;适用于Yolov5、Yolov7、Yolov8等各个Yolo系列&#xff0c;专栏文章提供每一步步骤和源码&#xff0c;轻松带你上手魔改网络 &…

xml合并

from xml.etree.ElementTree import ElementTree, Element, parseimport xml.etree.ElementTree as ETimport osimport shutilhole_path ./Annotationsarm_path ./Annotations1out_path ./out# 格式化def __indent(elem, level0):i "\n" level*"\t"if…