idea自动构建web项目

系统管理员(sysadmin)每年在重复性任务上浪费数千小时。 幸运的是,使用开源工具构建的Web应用程序可以自动消除很大一部分痛苦。

例如,使用Python和JavaScript构建Web应用程序只需要大约一天的时间。 这是任何Web应用程序必须具有的核心结构:

  • 后端来保留数据
  • 用于托管和路由流量的Web服务器
  • HTML用户界面
  • 交互式JavaScript代码,使其更具功能
  • CSS布局和样式使其漂亮

场景:简化员工离职

假设您是一家拥有一千名员工的公司的系统管理员。 如果普通员工在三年后离职,则必须每天裁员。 那是一个很大的时间浪费!

员工离职时有很多事情要做:从LDAP中删除其用户帐户,撤消GitHub权限,从薪资中删除他们,更新组织结构图,重定向其电子邮件,撤消其钥匙卡等。

作为系统管理员,您的任务是自动完成工作,因此您已经编写了一些辅助脚本来自动运行IT方面的内容。 但是HR仍然必须打电话给您,并要求您运行每个脚本,这是您不可以做的事情。

您决定花一整天的时间来自动解决此问题,从长远来看可以节省数百小时。 (还有另一个选项,我将在本文结尾处介绍。)

该应用程序将是您可以提供给HR的简单门户。 当HR输入离职用户的电子邮件地址时,该应用程序将在后台运行您的离职脚本。

它的前端是用JavaScript构建的,后端是使用Flask的Python应用程序。 它使用Nginx托管在AWS EC2实例上(或者可以在您的公司网络或私有云中)。 让我们从Python(Flask)应用程序开始依次查看每个元素。

从后端开始

后端允许您向特定的URL发出HTTP POST请求,并传入离职员工的电子邮件地址。 该应用程序为该员工运行脚本,并为每个脚本返回成功或失败。 它使用Flask (Python Web框架),非常适合像这样的轻量级后端。

要安装Flask,请创建一个Python虚拟环境,然后使用pip进行安装:

~ /offboarding$ virtualenv ~ /venv/offboarding
~ /offboarding$ source ~ /venv/offboarding/bin/activate
( offboarding ) ~ /offboarding$ pip3 install flask
Collecting flask
Downloading
...

使用Flask处理请求

通过使用@ app.route(<url>,...) 装饰函数在Flask中创建HTTP端点,并使用request变量访问请求数据。 这是一个Flask端点,可读取员工的电子邮件地址:

#!/usr/bin/env python3

from flask import Flask , request
app = Flask ( __name__ )

@ app. route ( '/offboard' , methods = [ 'POST' ] )
def offboard ( ) :
employee_email = request. json . get ( 'employeeEmail' )
print ( "Running offboarding for employee {} ..." . format ( employee_email ) )
return 'It worked!'

if __name__ == "__main__" :
app. run ( threaded = True )


它以状态200和文本“ It work!”响应HTTP请求 在身体里。 要检查它是否有效,请运行脚本; 这将运行Flask开发服务器,足以进行测试和轻松使用(尽管有警告)。

( offboarding ) ~ /offboarding$ ./offboarding. py
* Serving Flask app "offboarding" ( lazy loading )
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1: 5000 / ( Press CTRL+C to quit )

这是一个发出请求的curl命令:

~ $ curl -X POST \
-d '{"employeeEmail": "shaun@anvil.works"}' \
-H "Content-Type: application/json" \
http://localhost: 5000 /offboard
It worked !

最后一行是服务器的响应:它正在工作! 这是服务器打印的内容:

Running offboarding for employee shaun @ anvil.works ...
127.0.0.1 - - [ 05 / Sep / 2019 13 : 10 : 55 ] "POST /offboard HTTP/1.1" 200 -

它已经启动并运行了! 您有一个可以接收数据的端点。 展开它以使其运行预先存在的辅助脚本。

使用Python运行脚本

为了使事情简单,将脚本放在单个文件夹中并遍历该文件夹,运行您发现的所有内容。 这样,您无需修改​​代码并重新启动服务器即可将新脚本添加到离职流程中。 您可以将它们复制到文件夹中(或创建符号链接)。

这是修改后的Flask应用程序的外观(代码中的注释指出了一些最佳做法):

#!/usr/bin/env python3

from flask import Flask , request
import subprocess
from pathlib import Path
import os

app = Flask ( __name__ )

# Set the (relative) path to the scripts directory
# so we can easily use a different one.
SCRIPTS_DIR = 'scripts'

@ app. route ( '/offboard' , methods = [ 'POST' ] )
def offboard ( ) :
employee_email = request. json . get ( 'employeeEmail' )
print ( "Running offboarding for employee {} ..." . format ( employee_email ) )

statuses = { }

for script in os . listdir ( SCRIPTS_DIR ) :
# The pathlib.Path object is a really elegant way to construct paths
# in a way that works cross-platform (IMO!)
path = Path ( SCRIPTS_DIR ) / script
print ( '  Running {}' . format ( path ) )

# This is where we call out to the script and store the exit code.
statuses [ script ] = subprocess . run ( [ str ( path ) , employee_email ] ) . returncode

return statuses

if __name__ == "__main__" :
# Running the Flask server in threaded mode allows multiple
# users to connect at once. For a consumer-facing app,
# we would not use the Flask development server, but we expect low traffic!
app. run ( threaded = True )


将一些可执行文件放在scripts /目录中。 以下是一些执行此操作的shell命令:

mkdir -p scripts /
cat > scripts / remove_from_ldap.py <<EOF
#!/usr/bin/env python3
print('Removing user from LDAP...')
EOF
cat > scripts / revoke_github_permisisons.py <<EOF
#!/usr/bin/env python3
import sys
sys.exit(1)
EOF
cat > scripts / update_org_chart.sh <<EOF
#!/bin/sh
echo "Updating org chart for $1..."
EOF

chmod +x scripts /*


现在,重新启动服务器,然后再次运行curl请求。 响应是一个JSON对象,显示了脚本的退出代码。 看起来revoke_github_permissions.py在此运行中失败:

~ $ curl -X POST \
-d '{"employeeEmail": "shaun@anvil.works"}' \
-H "Content-Type: application/json" \
http://localhost: 5000 /offboard
{ "remove_from_ldap.py" : 0 , "revoke_github_permissions.py" : 1 , "update_org_chart.sh" : 0 }

这是服务器的输出; 这次它通知我们每个脚本何时开始运行:

Running offboarding for employee shaun @ anvil.works ...
Running scripts / remove_from_ldap.py
Running scripts / revoke_github_permissions.py
Running scripts / update_org_chart.sh
127.0.0.1 - - [ 05 / Sep / 2019 13 : 30 : 55 ] "POST /offboard HTTP/1.1" 200 -

现在,您可以通过发出HTTP请求来远程运行脚本。

添加身份验证和访问控制

到目前为止,该应用程序尚未执行任何访问控制,这意味着任何人都可以为任何用户触发非正式使用。 很容易看到如何滥用它,因此您需要添加一些访问控制。

在理想的情况下,您将根据公司标识系统对所有用户进行身份验证。 但是,例如根据Office 365对Flask应用进行身份验证将需要更长的时间 。 因此,请使用“ HTTP Basic”用户名和密码身份验证。

首先,安装Flask-HTTPAuth库:

( offboarding ) ~ / offboarding$ pip3 install Flask-HTTPAuth
Collecting Flask-HTTPAuth
Downloading …

现在,通过将以下代码添加到offboarding.py的顶部,需要用户名和密码来提交表单:

from flask_httpauth import HTTPBasicAuth
from werkzeug. security import generate_password_hash , check_password_hash

app = Flask ( __name__ )
auth = HTTPBasicAuth ( )

users = {
"hr" : generate_password_hash ( "secretpassword" ) ,
}

@ auth. verify_password
def verify_password ( username , password ) :
if username in users:
return check_password_hash ( users. get ( username ) , password )
return False

@ app. route ( '/offboard' , methods = [ 'POST' ] )
@ auth. login_required
def offboard ( ) :
# ... as before …


指定用户名和密码以使请求成功:

~ $ curl -X POST \
-d '{"employeeEmail": "shaun@anvil.works"}' \
-H "Content-Type: application/json" \
http://localhost: 5000 /offboard
Unauthorized Access

ubuntu @ ip- 172 - 31 - 17 - 9 : ~ $ curl -X POST -u hr:secretpassowrd \
-d '{"employeeEmail": "shaun@anvil.works"}' \
-H "Content-Type: application/json" \
http://localhost: 5000 /offboard
{ "remove_from_ldap.py" : 0 , "revoke_github_permisisons.py" : 1 , "update_org_chart.sh" : 0 }


如果人事部门乐于使用curl ,那么您将可以完成很多工作。 但是他们可能不会讲代码,因此在其上放一个前端。 为此,您必须设置一个Web服务器。

设置网络服务器

您需要Web服务器将静态内容呈现给用户。 “静态内容”是指最终由用户的Web浏览器使用的代码和数据,包括HTML,JavaScript和CSS以及图标和图像。

除非您希望整天离开工作站,并小心避免用力拉扯电源线,否则应将应用程序托管在公司的网络,私有云或其他安全的远程计算机上。 本示例将使用AWS EC2云服务器。

按照安装说明在远程计算机上安装Nginx:

sudo apt-get update
sudo apt-get install nginx

它已经可以将/ var / www / html中的任何内容提供给您,因此您可以将静态内容放入其中。

配置Nginx与Flask对话

配置它以了解Flask应用程序。 Nginx允许您配置有关URL匹配特定路径时如何托管内容的规则。 编写与确切路径/ offboard匹配的规则,并将请求转发到Flask:

# Inside the default server {} block in /etc/nginx/sites-enabled/default...
location = / offboard {
proxy_pass http: // 127.0.0.1: 5000 ;
}

现在重新启动Nginx。

假设您的EC2实例位于3.8.49.253。 在浏览器中转到http://3.8.49.253时,您会看到“欢迎使用Nginx!”。 页,并且如果您针对http://3.8.49.253/offboard发出卷曲请求,您将获得与以前相同的结果。 您的应用现已在线!

还有两件事要做:

  • 购买域名并设置DNS记录( http://3.8.49.253/offboard不太漂亮!)。
  • 设置SSL,以便对流量进行加密。 如果您是在线进行的,那么“加密”是一项出色的免费服务。

您可以自己弄清楚这些步骤。 它们如何工作在很大程度上取决于您的网络配置。

编写前端以触发脚本

现在是时候编写前端HR用来访问应用程序和启动脚本的时候了。

输入框和按钮HTML

前端将显示一个文本框,HR可以使用该文本框输入离职用户的电子邮件地址,并单击一个按钮将其提交到Flask应用程序。 这是用于此HTML:

<body>
<input type="email" id="email-box" placeholder="Enter employee email" />
<input type="button" id="send-button" onclick="makeRequest()" value="Run" />
<div id="status"></div>
</body>

空的<div>存储最近一次运行的结果。

将其保存到/var/www/html/offboarding/index.html ,然后浏览至http://3.8.49.253/offboarding 。 这是您得到的:

虽然还不是很漂亮,但是在结构上是正确的。

JavaScript和jQuery发出请求

请参阅HTML中的onclick =“ makeRequest()”以获取按钮? 它需要一个名为makeRequest的函数来使按钮在单击时调用。 此函数将数据发送到后端并处理响应。

要编写它,首先在HTML文件中添加一个<script>标记以导入jQuery ,这是一个非常有用JavaScript库,它将从您的页面提取电子邮件地址并发送请求:

<head>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</head>
...

要使用jQuery发出HTTP POST请求:

var makeRequest = function makeRequest ( ) {
// Make an asynchronous request to the back-end
$ . ajax ( {
type : "POST" ,
url : "/offboard" ,
data : JSON. stringify ( { "employeeEmail" : $ ( '#email-box' ) [ 0 ] . value } ) ,
contentType : "application/json"
} )
}

该请求是异步发出的,这意味着用户在等待响应时仍可以与该应用进行交互。 $ .ajax返回一个promise ,如果请求成功,它将运行传递给.done()方法的函数,如果请求失败,它将运行传递给.fail()方法的函数。 这些方法中的每一个都返回一个Promise,因此您可以像下面这样链接它们:

 $ . ajax ( ... ) . done ( do_x ) . fail ( do_y ) 

请求成功后,后端将返回脚本的退出代码,因此编写一个函数以针对表中的每个脚本名称显示退出代码:

function ( data ) {
// The process has finished, we can display the statuses.
var scriptStatuses = data ;
$ ( '#status' ) . html (
'<table style="width: 100%;" id="status-table"></table>'
) ;
for ( script in scriptStatuses ) {
$ ( '#status-table' ) . append (
'<tr><td>' + script + '</td><td>' + scriptStatuses [ script ] + '</td></tr>'
) ;
}
}

$('#status')。html()获取具有ID 状态HTML文档对象模型(DOM)元素,并将HTML替换为您传入的字符串。

发生故障时,使用HTTP状态代码和响应正文触发警报,以便HR人员可以引用该警报,以在应用程序停止生产时向您发出警报。 完整的脚本如下所示:

var makeRequest = function makeRequest ( ) {
// Make an asynchronous request to the back-end
var jqxhr = $ . ajax ( {
type : "POST" ,
url : "/offboard" ,
data : JSON. stringify ( { "employeeEmail" : $ ( '#email-box' ) [ 0 ] . value } ) ,
contentType : "application/json"
} ) . done ( function ( data ) {
// The process has finished, we can display the statuses.
console. log ( data ) ;
var scriptStatuses = data ;
$ ( '#status' ) . html (
'<table style="width: 100%;" id="status-table"></table>'
) ;
for ( script in scriptStatuses ) {
$ ( '#status-table' ) . append ( '<tr><td>' + script + '</td><td>' + scriptStatuses [ script ] + '</td></tr>' ) ;
}
} )
. fail ( function ( data , textStatus ) {
alert ( "error: " + data [ 'statusText' ] + " " + data [ 'responseText' ] ) ;
} )
}

将此脚本另存为/var/www/html/offboarding/js/offboarding.js并将其包含在HTML文件中:

<head>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="js/offboarding.js"></script>
</head>
...

现在,当您输入员工的电子邮件地址并点击Run时 ,脚本将运行并在表中提供其退出代码:

但是,它仍然很难看! 现在是解决该问题的时候了。

使它看起来不错

Bootstrap是一种以中立方式设计应用程序样式的好方法。 Bootstrap是一个CSS库(以及更多),它提供一个网格系统,使基于CSS的布局非常容易。 它也为您的应用程序提供了超级干净的外观。

Bootstrap的布局和样式

重组HTML,使事情最终出现在Bootstrap的行和列结构中的正确位置:列进入行,而行进入容器。 使用colrowcontainer CSS类将元素指定为列,行和容器,而card类为该行提供边框,使其看起来是独立的。

输入框放置在<form>内 ,文本框获取<label> 。 这是前端的最终HTML:

<head >
< link href = "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel = "stylesheet" / >
< link href = "https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel = "stylesheet" / >
<script src = "https://code.jquery.com/jquery-3.4.1.min.js" > </script >
<script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" > </script >
<script src = "js/offboarding.js" > </script >
</head >

<body >
<div class = "container" style = "padding-top: 40px" >
<div class = "row card" style = "padding: 20px 0" >
<div id = "email-input" class = "col" >
<form >
<div class = "form-group" >
<label for = "email-box" > Employee Email</label >
<input type = "email" class = "form-control" id = "email-box" placeholder = "Enter employee email" / >
</div >
<input type = "button" class = "btn btn-primary" id = "send-button" onclick = "makeRequest()" value = "Run" / >
</form >
<div id = "status" > </div >
</div >
</div >
</div >
</body >


现在是该应用的外观,这是一个巨大的改进。

添加状态图标

还有一件事:该应用程序报告状态为0表示成功,状态1表示失败,这通常会使不熟悉Unix的人感到困惑。 对于大多数人来说,如果它使用诸如对勾图标表示成功,而使用“ X”图标表示失败,则将更容易理解。

使用FontAwesome库获取选中标记和X图标。 就像从Bootstrap一样,只需从HTML <head>链接到库。 然后在JavaScript中修改循环以检查退出状态,如果状态为0则显示绿色,如果状态为其他,则显示红色X:

for ( script in scriptStatuses ) {
var fa_icon = scriptStatuses [ script ] ? 'fa-times' : 'fa-check' ;
var icon_color = scriptStatuses [ script ] ? 'red' : 'green' ;
$ ( '#status-table' ) . append (
'<tr><td>' + script + '</td><td><i class="fa ' + fa_icon + '" style="color: ' + icon_color + '"></i></td></tr>'
) ;
}

测试一下。 输入电子邮件地址,点击运行,然后…

美丽! 有用!

另外的选择

多么富有成效的一天! 您构建了一个使工作的重要部分自动化的应用程序。 唯一的缺点是您必须维护云实例,前端JavaScript和后端Python代码。

但是,如果您没有一整天的时间花在自动化或不想永远维护它们呢? 系统管理员必须使所有板块保持旋转,处理紧急请求,并应对越来越多的高优先级票务积压。 但是您可能可以在星期五下午偷偷进行30分钟的流程改进。 那段时间您能取得什么成就?

如果这是90年代中期,则可以在30分钟内在Visual Basic中构建某些东西。 但是您正在尝试构建一个Web应用程序,而不是桌面应用程序。 幸运的是,这里有帮助:您可以使用Anvil (一种基于开放源代码软件构建的服务)来使用Python编写应用程序-这次只需30分钟:

全面披露:Anvil是一项商业服务-尽管我们在本文中所做的一切都可以免费获得! 您可以在Anvil博客上找到有关构建此项目的分步指南 。

无论您走的是前进的道路-自行完成或使用诸如Anvil之类的工具,我们都希望您继续使所有事情自动化。 您要自动化哪种流程? 发表评论以激发您的系统管理员。

翻译自: https://opensource.com/article/19/9/web-apps-sysadmins

idea自动构建web项目

idea自动构建web项目_构建Web应用程序以自动执行系统管理员任务相关推荐

  1. java web项目_[适合初中级Java程序员修炼手册从0搭建整个Web项目](二)

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206种一棵树最好的时间是十年前,其次是现在 six-finger-web 一个Web后端 ...

  2. 用eclipse创建动态web项目手动生成web.xml方法

    转载自   用eclipse创建动态web项目手动生成web.xml方法 今天在学习JSP时先创建了一个web项目,后来在用到web.xml文件时,才发现项目创建时更本就没有自动创建web.xml文件 ...

  3. maven web项目中的web.xml的版本如何更改

    maven web项目中的web.xml的版本如何更改 问题 因web.xml的版本太低不支持el表达式的问题(maven3.6版本通过底层的maven web插件生成的最终的web.xml文件版本只 ...

  4. **Maven web项目报错**-web.xml is missing and <failOnMissingWebXml> is set to true 原因:生成的maven web项目webap

    Maven web项目报错-web.xml is missing and is set to true 原因:生成的maven web项目webapp下缺少web.xml 解决方法:选择项目名-右击, ...

  5. 如何通过域服务器推送安装文件,域环境推送exe程序并自动安装教程域环境推送exe程序并自动安装教程.pdf...

    域环境推送exe程序并自动安装教程域环境推送exe程序并自动安装教程 域环境推送exe 程序并自动安装教程 一.思路 微软可以通过组策略对域中的计算机实现对 MSI 格式的软件程序实现派发后自动运行, ...

  6. spring创建web项目_使用Spring WS创建合同优先的Web服务

    spring创建web项目 1引言 本文介绍了如何使用来实现和测试SOAP Web服务 Spring Web Services项目 . 本示例将JAXB2用于(取消)编组. 为了开发服务,我将使用合同 ...

  7. java webpack web项目_官方出品,微信小程序和 Web 端同构解决方案——kbone

    介绍 最近在琢磨一些小程序开发和移动web开发,偶然间在Github上看到了这样一个项目--kbone,一个致力于微信小程序和 Web 端同构的解决方案.微信小程序的底层模型和 Web 端不同,我们想 ...

  8. 简单有趣的web项目_有趣而简单的电子项目书

    简单有趣的web项目 "当您去商店购买电子小物件时,您会想到自己可以自己做一个吗?或者甚至可以自己做一个有趣的事情?" 这就是约翰·贝希塔尔(John Baichtal)的面向初学 ...

  9. 用gradle启动java项目_构建Java项目

    #构建Java项目# 上一节我们简要介绍了如何编写一个单机的To Do应用,接下来要打包部署成可执行的应用,我们需要编译源代码,生成的class文件需要打包到JAR文件中.JDK提供了javac 和j ...

最新文章

  1. 心脏病预测模型(基于Python的数据挖据)
  2. 数值计算领域的“圣经”,图灵出了新版本 | 11月书讯
  3. 使用STC8G1K08制作调频接收模块TEA5767配置电路
  4. java 打印map后的输出
  5. PyTorch 实现经典模型2:AlexNet
  6. Spring boot外部配置加载顺序
  7. 全面升级 —— Apache RocketMQ 5.0 SDK 的新面貌
  8. js实现拖拽+碰撞+重力
  9. pytorch 加载模型_福利,PyTorch中文版官方教程来啦(附下载)
  10. 【转载】Java中各种修饰符与访问修饰符的说明
  11. 安装Ubuntu nginx及其配置安装Php
  12. 杭电oj 1000 c++ 版本
  13. python __name__怎么使用_python学习笔记26(python中__name__的使用)
  14. log explorer for sql 不存在或访问被拒绝_原创干货 | 未授权访问漏洞批量化
  15. chainmaker-go-sdk get cert hash failed, get cert hash failed, send QUERY_SYSTEM_CONTRACT failed
  16. iOS视频裁剪、拼接、添加水印、添加背景音乐
  17. 博士申请 | 新加坡国立大学Xinchao Wang老师招收图神经网络方向博士/博后
  18. 怎么用PDF裁剪工具来裁剪PDF页面
  19. 跟李沐学AI:A Gentle Introduction to Graph Neural Networks(图神经网络GNN)
  20. grub4dos 启动ubuntu 12.04

热门文章

  1. Redis:数据并发竞争顺序性
  2. Kafka与RocketMQ的对比分析
  3. 使用networkx来生成网络科学里面三种常见的网络
  4. springboot整合Apollo
  5. Objective-C之数组
  6. Struts2 用 s:if test 判断属性和字符串相等时 注意双引号和单引号的使用 《转》...
  7. 活力四射的Windows Embedded Standard 7
  8. 关于huihoo的一些意见和建议(转贴自Huihoo社区)
  9. 浙江省计算机二级办公软件高级应用技术考试时间,最新浙江省计算机二级办公软件高级应用技术考试大纲...
  10. Partition Array by Odd and Even