现场的人不是战士,也不是全栈后端如何成为

我喜欢开始各种附带项目,我认为这是学习新事物和真正有价值的最好方法之一。而且我有一个严重的缺陷-我几乎永远都做不完。当然,这与学习项目无关,而我将根据雇主给我的成绩或任务设定学习项目。我说的是我自己的想法,这些想法是我在不断工作或学习的基础上提出来的。每当我掌握一些我认为急需的全新技能并且看不到学习其他类似技术的前景时,我都会忘记该项目。但是这次我决定提高自己-开始这个项目,完成它,并讲述我所经历的道路。



关于我自己的一点



我拥有专门的教育,数学学士学位和IT硕士学位。令人惊讶的是,我在大学掌握的很多东西对我都很有用,尤其是硕士学位。无论如何,我都设法朝着正确的方向调动大脑,以有效地吸收必要的信息,在这个领域表现出色,找到工作,并发展自己的职业。



在学习期间,我是C ++迷和游戏开发人员。然后,我开发了一个自写引擎,并在上面写了游戏,然后尝试。我拥有C语言的文凭,并且在计算中使用了图形处理器。然后,我对Java和Android开发产生了兴趣。他用这种语言完成了多个教育项目,然后,作为一个学生项目的一部分,在一家国际公司的支持下,编写了一个控制台实用程序来分析程序性能。然后,所有这些都发展成为一个Android应用程序,可以测试您的手机的性能并与他人进行比较。



python世界即将出现。出乎意料的是,在我的好朋友的建议下,我对数据科学和python感兴趣了,这已经超过了四年前。巧合的是,我不得不换工作,并且我的技能被评估为适合开始在内部分析服务的后端工作。因此,通过数据分析,我开始使用这种语言进行Web开发。



值班时,当真正的前端开发人员非常忙或者不首先考虑UI质量标准时,我还必须成为一名全栈开发人员。



这是在没有完全沉浸于技术细节的情况下创建自己的完整Web应用程序所采用的路径的描述。从我的资源库到提交的链接将被删除。简要介绍此旅程的各个阶段:



  • UI
  • , , CI
  • production-
  • production-
  • https

- AWS. , .







该应用程序主题的选择是另一回事,最终选择取决于跟踪习惯。主页将具有一组具有跟踪习惯的按钮。我们做了一个动作-按下按钮-每天如此。数据应该以表格的形式保存,并以表格的形式显示在单独的页面上,以行的形式显示习惯,以列的形式显示日历天,已填充的单元格指示在该天执行了所需的操作。就像一个简单的纸张习惯追踪器。





技术栈对我来说很明显:react,django,postgres,nginx,uwsgi。



布局初始用户界面



我决定从用户界面和安装启动nodejs.org/en/download/package-managergithub.com/facebook/create-react-app,然后创建了一个项目:



npx create-react-app easytrack


然后我开始布局。从一开始,我想不出什么比直接在程序中对业务逻辑对象列表进行硬编码并将它们显示为ul标记中的列表更容易的事情了。这些对象是:主题组,被跟踪的项目,特定日期在特定日期的实际跟踪记录。



在第一页上,我有主题组,然后单击其中的任何一个,就会打开一个可以跟踪的项目列表。



我还组成了另一个页面,其中包含一个简单的表,其中包含最近几天的统计信息。



开发一个后端



在此阶段,需要后端。需要将对象保存到数据库,管理用户并区分权限。我已经必须在自己的项目中使用Django(当然,并没有得出合理的结论),但是有一个困难-我必须使用Django Rest Framework,这是我从未涉及过的。感谢构建Django 2.0 Web应用程序[1]。除了上一章(他们在DRF上创建API的上一章)外,我从头到尾地介绍了这一过程,我用眼睛浏览了一下。在故事的过程中,我将不止一次地向她求助。



无处可去,打开www.django-rest-framework.org文档并开始吸烟,然后转向提到的书。



我安装并激活了虚拟环境,安装了Django,并在项目的根目录中创建了一个django项目:



virtualenv venv
. ./venv/bin/activate
pip install django
django createproject config


我将主文件夹重命名为django,这样一来,有关其内容的所有信息都将立即清除。它的内部将是一个名为config的python模块,这也非常方便。包装在react文件夹中的前端代码。这就是开发文件夹的一般结构的方式,这一结构一直保留到今天(请参阅Github)。



在项目的根本,我创建了主应用程序:



django createapp core


我以与在前端,序列化器和视图(在Github中提交的链接)进行硬编码的完全相同的格式创建了业务逻辑模型类

我们不用理会数据库,而是使用默认的SQLite。通过管理面板,我上传了一些之前在前面进行硬编码的测试数据示例。我们正在尝试连接到前端。 python3 manage.py runserver在一个选项卡中,yarn在另一个选项卡中启动并驱动。



React开发服务器在端口3000上运行,而Django在端口8000上运行。最简单的就是在前面编写fetch('http:// localhost:8000 / ...')请求。但是由于cors-origin的原因,它无法正常工作,cors-origin是一种特殊的保护措施,可防止任何站点向任何服务器发出自动请求。因此,无需三思而后行,我将其内置到后端中django-cors-headers),对其进行了配置-它可以正常工作。只有到那时,我才猜测要在package.json中添加一个代理部分并指向后端,然后fetch('/ api / v1 / / ...')开始正常工作,不再需要其他设置。



刚开始时,这太天真了,因为我在构造函数中发出了异步请求-一切对我都有效,还可以。直到后来,我才了解了生命周期方法,您可以在哪里以及不应该在何处进行此类工作。现在显示了元素,可以创建新元素。



实施用户管理和权限分离



在此阶段,唯一缺少的是对数据元素的权限分离:它们都是由匿名非登录用户创建的。我需要以某种方式集成到其中,而不破坏django生态系统。



首先,我在前端对登录名/密码进行了硬编码,并使用值'Basic'+ base64.encode(用户名+“:” +密码)组成了Authorization标头。然后我想生成一个base64格式的字符串,并在输入用户名/密码时将其保存在客户端上。但是就安全性而言,对此决定存在很大的疑问,我想尝试一些不同的方法。



我在互联网上短暂浏览了一下,并了解了JWT技术和django-rest-framework-simplejw模块其中提供了DRF的身份验证类以及用于获取令牌对和更新访问令牌的视图。



从前端来看,将几个令牌保存在localStorage中并传递带有值“ Bearer access-token”的Authorization标头就足够了。最后,我布置了登录页面,并使用权限类(链接到Github commit关闭了未经授权的用户对网站的所有访问。在前面,如果没有刷新令牌,我将重定向到登录页面(链接到Github commit)。



然后,我可以在该网站上注册,在后端创建视图,布置页面,设置发送请求。将来,我的梦想是通过邮件编写帐户激活信息。



重构,实现缺少的基本功能,CI



此时,一个最小可用的应用程序出现了,我想收集反馈。我向妻子展示了该应用程序,并要求我在没有任何提示的情况下使用它。注册非常成功,但随后一切都没有按照我的想法进行。然后,我意识到主题文件夹不应位于最前列,而应该是辅助工具,并且我们还需要添加提示,提示我们正在创建一组按钮,以便我们每天可以单击一次。她希望它像一个带有电子表格的常规纸张习惯跟踪器,您需要在电子表格上进行绘制。当我意识到这一点时,我开始进行重构。除此之外,还有一些东西需要重构。我几乎从头开始研究了模块结构。



在这一点上,我决定添加美观,CSS样式和响应式布局。在这方面,我不是特别坚强,而是依靠CSS框架。尽管实际上我不想使用Bootstrap,但根据星级数从npmjs.com下载的影片取决于Bulma。至少,我应付了这个任务。 同时,我改进了后端功能。制作了完整的CRUD。通过邮件确认注册的梦想也实现了。我弄清楚了发送信件的功能,获得了通过调试邮件服务器调试所有内容的能力。







python -m smtpd -n -c DebuggingServer localhost:1025


为了进行分期,我开了一个垃圾Google帐户,并设法通过Google邮件发送信件。



至于后端的测试覆盖范围,一切工作本身都很不错,但到目前为止,一切都完全呆滞了。但是我并没有感到绝望,突然间它就会被调整。



下一步是设置CI,我启动了GithubActions来运行测试,使用配置构造函数来运行它,对其进行了一些调整。



生成生产环境的设置



在短时间整理好代码和逻辑的小细节之后,我不得不开始形成生产配置。为此,我受到了同一本书的启发[1]。我将django配置文件python-dependencies分为3部分(链接到Github commit):





  • 常见-在任何环境下所需的一切
  • dev —
  • prod —


, .



uwsgi, nginx , dockerfile, .



[1] «1 — 1 », , , . phusion/baseimage, Ubuntu, .



, , postgres, . ( Github).



production-



, [1], AWS, . , - . , , , , . Free Tier, , , ? .



, AWS - , . , . , ECS.





Elastic Container Service



我看到Github Actions构建器允许您在AWS ECS上为连续容器部署任务创建配置。假设我开始深入研究此服务,并意识到在本地控制台中,我需要创建集群,创建任务定义并描述容器,之前已将其映像保存在另一个AWS ECR服务中,该服务按功能是Dockerhub。该控制台提供了两种类型的群集:Fargate和EC2。第一项技术是完全无服务器的,这意味着我们只需启动容器,运行时就可以处理一切。第二类群集中的容器在云中它们自己的虚拟机实例上运行。我不想长期从事此工作,而是基于Fargate创建了一个集群。但是我遇到了一个事实,就是我无法将秘密值传递给容器,因此,任务在不断下降。



当我试图将容器恢复到工作状态时,群集已经工作了几个小时,并且我将钱添加到了我的选项卡中并支付了服务费用。该技术本身证明是付费的,不适用于免费套餐。我还清了群集,并决定稍后再处理付款。我在文档中读到,除了使用EC2资源外,您无需为在EC2之上使用ECS支付额外费用,但是EC2受Free Tier覆盖,因此我决定尝试这种方式。



AWS支持



最后,有人对我撒谎,他们为此配置向我收取了更多钱。总计0.32美元,虽然有点儿,但还是很可惜。然后我写了一封支持信,说我在设置方面遇到了困难,并且一直以为我适合免费套餐,但对我来说什么都没有解决,所以钱被提取了。我寻求帮助。为了响应我的电话,他们高兴地回应,给了一张1美元的抵用券,其中包括所有意外费用。很好



结果,我不得不忘了这个容器服务,而以最纯粹的形式掌握了EC2。



弹性计算云



EC2 — . Free Tier 750 . , , - , .



[1] docker-machine, . , EC2. docker .



, dockre-machine create… EC2. docker-compose up -d . 80 . , «Public DNS» , .





Relational Database Service



AWS RDS. . , ( postgres) , Free Tier, . , , .



Simple Email Service



我还必须面对未发送信件的事实。事实是,所有邮件服务都禁止与EC2实例匹配的IP,以对抗垃圾邮件。必须使用SES。另一个AWS服务。



我还配置了它,指出我要从中发送信件的邮箱,一切都很好。但是,到目前为止,并不是所有事情都那么乐观。默认情况下,新帐户处于沙盒模式,该模式不允许将电子邮件发送到未经确认的邮箱。只好为我的Beta测试人员确认框。





注册域并配置用于https访问的证书



要完全测试该应用程序,需要建立一个https连接,事实证明,如果不注册域,这是不可能的。我不想通过不安全的连接传输电子邮件地址,密码和令牌而使它们面临风险。对于这种情况,我搜索了整个Internet。一些注册服务商并不适合,因为它很昂贵,但是在某些地方却非常昂贵,此外,许多注册人的评论还很糟糕。在我浏览的同时,Yandex广告网络了解了我的需求,并立即向我提供了一家公司,我可以在该公司注册39卢布的域名。关于此服务的评论更多,因此我创建了一个帐户,选择了一个免费域并为我注册。



然后,为了使用该域访问我的EC2实例,我在AWS Route 53服务中创建了一个托管区域,注册了DNS设置,并将NS记录重写到了将域注册到亚马逊的服务的个人账户中。



我使用了“加密”服务来创建证书。我决定采用这种配置:本地nginx使proxy_pass到容器地址,容器旋转并可以通过端口8080访问。使用certbot控制台实用程序,生成证书并自动配置https并不难。最后,允许访问端口443上的虚拟机。



该项目的发展已得出合乎逻辑的结论



, . , , SES , . , . , , , , , , , , . , , . :





  • , , . .
  • -
  • ,
  • , -


— , , . React , AWS, , , .



但是主要的认识是,这个领域的人根本不是战士。我在这个项目上工作了两个多月,在业余时间里花了很多时间……您知道吗?我从来没有如此可怕地缝合过。变得越来越明显的是,您年龄越大,学习“只是那样”的东西的欲望就越少,而对“有趣”的事情做很多工作的欲望就越少。但与此同时,您会注意到有更多的机会去做一些有益的事情,以谋福利。您开始欣​​赏专注的工作,团队合作以及休息以及与亲密人共度的时间。



在Github上的代码



链接



  1. 构建Django 2.0 Web应用程序