星期四

如何在Heroku上免费部署FastAPI应用

 

介绍

Heroku是一个云平台即服务(PaaS),支持Ruby on Rails,Java,Node.js,Scala,Clojure,Python,PHP和Go。Heroku的免费版本每月提供550–1000 dyno小时。如果没有人使用您的应用程序,则您的应用程序会在30分钟后进入休眠状态。如果您的每月动态小时数在限制范围内,则您的应用程序将始终免费。

Dynos是Heroku平台上的隔离虚拟Linux容器。

在本文中,您将了解设置和运行FastAPI项目并使其在Heroku上24/7处于活动状态是多么容易。

我立方米[R rently主办本FastAPI网站Heroku的作为演示

GIT

我使用Gitstart自动执行Git初始化。从您的终端运行git init添加.gitignore和自述文件并提交一条消息。这会在Github中创建一个新的仓库,它将推送所有文件。

$ mkdir my_new_project 
$ cd my_new_project
$ gitstart

设置您的Heroku帐户

个人帐户每月有550个免费动态小时基础。除了这些基本时间之外,使用信用卡验证的帐户[1]将获得每月免费dyno配额增加的450小时[2]

您需要将SSH密钥添加到Heroku。[3]
安装Heroku CLI [4],
然后从您的终端登录到Heroku并创建一个Heroku应用程序:

$ heroku登录
$ heroku创建
heroku创建输出。图片由作者提供。

您可以将自定义域添加到您的Heroku应用。[5]

如何在Heroku上为FastAPI创建require.txt

Heroku需要requirement.txt安装Python软件包。pipreqs[6]根据您项目中的导入生成它。

$ pip install pipreqs 
$ cd my_new_project
$ pipreqs ./#
如果您已经具有
require.txt $ pipreqs --force ./

由于pipreqs是基于生成的,因此import您需要requirements.txt手动添加以下内容

uvicorn == 0.12.3 
aiofiles == 0.6.0
python-multipart == 0.0.5
jinja2 == 2.11.2

您需要uvicorn在Heroku上启动ASGI服务器。您需要aiofiles静态文件。如果您的项目具有表单,请添加python-multipart如果您的项目使用模板引擎,请添加jinja2

runtime.txt

Heroku使用默认的Python版本。为了使用特定的Python版本,请在runtime.txt您的Python版本中添加例如:

python-3.8.6

程序文件

Heroku需要Procfile。

如果您在app目录中有main.py ,请添加以下内容:

网址:uvicorn app.main:app --host = 0.0.0.0 --port = $ {PORT:-5000}

如果main.py在根目录中:

网址:uvicorn main:app --host = 0.0.0.0 --port = $ {PORT:-5000}

环境变量

Heroku不使用.env文件。而是将.env文件中的值添加到Config Vars。您可以在“设置”标签下找到它。

将环境变量添加到Config Vars。图片由作者提供。

如何上传到Heroku

现在您可以将项目推送到Heroku了:

$ git push heroku main 
$ heroku open

heroku open命令在浏览器中打开您的项目。

git在终端上推送heroku main。图片由作者提供。

如何添加子域

我正在使用Cloudflare,这是我必须要做的。

选择CNAME作为类型。添加您的子域名作为名称。为内容添加您的Heroku域。您的Heroku域名类似于serene-example-4269.herokuapp.com。

下图显示了如何添加toolbox.mywebsite.com子域。

向Cloudflare添加子域。

如何使您的应用保持活动状态24/7

闲置30分钟后,Heroku应用程序进入空闲状态。您可以使用找到您的应用程序流程heroic ps

heroku ps输出显示为空闲。图片由作者提供。

您可以在最后一行找到“ idle”。

这是我的其他应用程序进程状态,显示为“启动”。

heroku ps输出显示出来。图片由作者提供。

cron-job.org [8]和Kaffeine [9]提供免费服务。两者都按计划的时间访问您的URL。

cron-job.org

您可以通过添加URL和执行计划来创建cronjob。

cron-job.org Cronjobs标签。图片由作者提供。

对于您的cronjob,您需要选择每15分钟一次。如果您每30分钟设置一次,则可能会延迟5到15秒。

选择每30分钟进行一次cronjob。图片由作者提供。

您可以轻松地编辑或删除cronjob。

如何修复失败的Cron作业

您的cron作业可能无法告诉“响应数据太大”或“输出太大”。

图片作者

cron-job.org从您的URL /脚本接受最多4 kB的响应数据。要解决此问题,您可以创建一个返回JSON字符串而不是HTML页面的终结点。

咖啡因

Kaffeine每隔30分钟会ping您的Heroku应用程序一次,因此它永远不会进入睡眠状态。

咖啡因网站。

如何从咖啡因中删除您的应用程序

网站中的链接无效,但是如果您单击下面的链接,该链接对我有用。

http://kaffeine.herokuapp.com/#decaf

从咖啡因中删除您的应用程序。

如何重命名您的应用

$ heroku apps:重命名new_app_name

重命名应用程序时,请不要忘记更新您的cron作业

如何SSH到Heroku

您可能要SSH到Heroku。heroku ps:exec做到这一点。

$ heroku ps:exec
建立凭据...完成
在⬢demo-desuyo上连接到web.1 ...
〜$

结论

Heroku为您的项目提供最多1000个小时的免费托管,其使用的RAM不足512MB。您可以使用您的域名。如果您需要自定义域上的SSL,则需要升级到Hobby层。

cron-job.org和Kaffeine提供cronjob来访问您的URL以避免睡觉。


星期二

利用强化学习设计游戏中的智能AI

强化学习主要的原理是根据状态而采取行动,行动而获得报酬而在后来的行动中选择更高报酬的一方。

我们假设一个游戏有类似股票的交易市场,有打怪获得经验的副本,有种植而获得产品的养成玩法,亦有关系到角色的装备系统。

以上来看评价报酬的参数就不止一个了,有金钱、等级、角色的能力值等等。

对于交易市场的问题

在交易中并不是一个行为就可以获得金钱的提升的,通常要进行买入和卖出才能评价行为的报酬。对此我有以下的考虑:

* 对于将要交易的物品进行价格评估,而在购买和卖出的时候都能获取报酬的评价。缺点:在未卖出时机器可能会只专注于购入而忘记了真正的获利。

* 对时间的理解也加入到AI中以实现时机决策。这说上去虽然简单但实现起来也有不同的方向。
1,对于每次行为判定时机都对市场所有的物品进行持仓评价(状态观测),而对于评价再进行分析而行动。行动前的结果将对上一次行动进行评价(以价格相对的变化等)
2,在购买的时候同时决定卖出时机,把这行为包装为一次行动并进行评价。

对于整体的报酬评价

由于评价参数就不止一个,有金钱、等级、角色的能力值等等,所以每个智能AI都应配备一个转换表,用所有参数生成一个最终结果值,以此值来评价行动的结果。

星期四

利用Python生成HTML文件的思想

我是一个不太喜欢HTML的人,感觉HTML说是程序语言更不如说成是一种界面设计码,总感觉它是缺点比较多,既然现在的语言大多数都是面向对象的语言,那为什么不用面向对象的思想将其解耦呢?

我虽然能力不足,时间也不多,但把这个思想和实现方法记录一下比较好。

首先是定义,在HTML中的东西都可以叫做element,就是元素,那我们可以定义一个基类叫做Element,在这类里的函数到时再加。

对于广义的HTML其实还包含css,css是一种style,就是样式,样式应该有可置换性,在想换的时候要可以简单置换。

而css并不属于element,所以当为它们准备一个基类,暂时叫Css吧。

而对于更广义的HTML实质上包含逻辑,就是JavaScript,但对逻辑的内容是难以进行面向对象化的,可以借用一些Python转JavaScript的工具来进行。对于逻辑的面向对象暂不执行。

对于在HTML引用css时使用字符串可能会有打错的时候,在引用时调用相应的抽象函数是理想的做法。

在抽象层之下还要有具体实现层,在具体实现时应当可以选择是导出css到不同文件,或导出到一个文件中。

重点:对于css的使用应当在较高的抽象层,以防止对特定css进行编程。css的可替换性应当充分地被表现出来,比现在的css还要充分。

对于css的解耦




星期三

在日本的免费拿钱的广告是真是假?

大家好,我是在日本住的normidar。

在日本看YouTube的时候经常弹出一些“轻松获取巨额日元”的广告,我也点击进去过,那么这些到底是不是真的呢?如果这是骗局,那这骗局在中国人看来非常的老土。

在中国以外的东方地区一个叫做LINE的应用,它就想微信一样。通常这些广告会引导我去加他们的公众号,然后再进行下一步操作。

比如这个:

在这里就是

星期二

尝试加入了自由者联盟的感想和见闻

在YouTube有个频道叫做小船的,在几个月前就了解到了,她这里主要讲的是如何在网络上赚钱的方法。后来了解到她建立了一个社团,是一个收费的社团,价格为19美金一个月,我尝试加入试了下。

虽然现在还是刚刚加入,可能未完全了解内部的构造,慢慢更新这文章。

不知是我进入到时间迟了还是怎么样,大体上讨论频道并不是非常活跃。

再看看资源模块,在入社团之前说送的两套书籍的确是送但是是在入团后14日之后解锁,而在加入时是有14天的免费体验期长,实质上还是要付费才能够获取资源,我还未到付费的日期,先付第一次费看看结果如何。

希望能够真正获得网络攒钱的知识。

星期一

python利用字典爬取网页

 我们有一个包,叫做pycrawler,利用这个包可以放心地爬取网页数据,利用的是chome的内核,在启用此爬取器时,首先要生成一个map来设定爬取规则,爬取器会自动利用此爬取规则进行爬取网页数据,当网站是静态的get请求时你只需要一个规则就可以爬取指定数据,包还会自动帮你去除某些网站里的多余空格和<br/>。

包内还含有数据扁平化工具,如果你需要此包,请联系我。


星期四

在Flutter中使用NumberPicker(数字选择器)

首先说明一下pick这个英文单词,这个单词是 ‘挑选而取出一个’ 的意思,而pick up是捡起的意思。

NumberPicker的包地址是:numberpicker: ^1.2.1 #请在包中心选择更新版本

此包使用NumberPicker类进行使用,但默认的构造函数是不能用的。

decimal:在数据库中也有使用的单词,意思是‘带小数点的’。
horizontal:打横的,水平的。
integer:整数。

看似只有数字能够选择的样子,但事实上并不是如此,只是内部是利用数字来进行分别,其中有一个函参(函数型参数)叫做textMapper,此函数会导入一个String并要求一个String,看到Mapper就知道相当于一个转换器的感觉。

这次我使用integer的构造函数来看看效果,代码如下:
然后效果如下:
功能是用来选择二进的长度,用于创建数据表时设定长度,当然代码的效果只是中间那条数字选择带,值得注意的是实际上value只是0到16,而利用mapper使输出变为2的value次方而已,获取值时需要再次运算一下结果。

mapper:映射器。

以上


星期六

どうやってwidgetにイベントを入れます?


どうやってwidgetにイベントを入れますか
以下のコードの通りすればいいです

InkWell( 
     onTap: () {
         //イベント 
     }, 
     child: //貴方のwidget 
 );


他のtoolでもあります:

GestureDetector(
    ontap: () {},
)

どうやってユーザー別にFirebaseのrealtime database

以下のコードをコピーして図の通りに書き込めばるいいでしょう

// These rules grant access to a node matching the authenticated
// user's ID from the Firebase auth token
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      },
    }
  }
}

旋转的旧记忆