从Web服务器在AWS上触发Python脚本

时间:2017-02-03 03:01:07

标签: php python mysql postgresql amazon-web-services

简要了解我目前的设置:

用于收集Python脚本数据的HTML表单

PHP将表单数据(POST)插入到输入MySQL表

PHP public class AuthorizationController : Controller { private OpenIddictUserManager<ApplicationUser> _userManager; public AuthorizationController(OpenIddictUserManager<ApplicationUser> userManager) { _userManager = userManager; } [HttpPost("~/connect/token")] [Produces("application/json")] public async Task<IActionResult> Exchange() { var request = HttpContext.GetOpenIdConnectRequest(); if (request.IsPasswordGrantType()) { var user = await _userManager.FindByNameAsync(request.Username); if (user == null) { return BadRequest(new OpenIdConnectResponse { ErrorDescription = "The username or password provided is incorrect" }); } var identity = await _userManager.CreateIdentityAsync(user, request.GetScopes()); // Add a custom claim that will be persisted // in both the access and the identity tokens. if (user.Avatar != null) { identity.AddClaim("user_avatar", user.Avatar, OpenIdConnectConstants.Destinations.AccessToken, OpenIdConnectConstants.Destinations.IdentityToken); } if (user.InSiteUserName != null) { identity.AddClaim("insite_username", user.InSiteUserName, OpenIdConnectConstants.Destinations.AccessToken, OpenIdConnectConstants.Destinations.IdentityToken); } identity.AddClaim("hasLoggedIn", user.HasLoggedIn.ToString(), OpenIdConnectConstants.Destinations.AccessToken, OpenIdConnectConstants.Destinations.IdentityToken); // Create a new authentication ticket holding the user identity. var ticket = new AuthenticationTicket( new ClaimsPrincipal(identity), new AuthenticationProperties(), OpenIdConnectServerDefaults.AuthenticationScheme); ticket.SetResources(request.GetResources()); ticket.SetScopes(request.GetScopes()); return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme); } return BadRequest(new OpenIdConnectResponse { Error = OpenIdConnectConstants.Errors.UnsupportedGrantType, ErrorDescription = "The specified grant type is not supported." }); } } } 的Python3.4 script.py row_id

Python使用exec收集行ID并运行代码并将结果插入到输出MySQL表中。当完整的PHP显示报告(PHP等待Python完成时,我使用sys.argv[1]转到报告URL)。

报告页面是html,输出的MySQL表格中填充了PHP填空的空白。

这对我来说测试和开发都很好。当我将它发布到公司内部以进行更一般的测试时,问题出现了 - 它托管在VPS服务器上,当服务器运行多个Python实例时,它像狗一样运行(正如我们在苏格兰所说,因为说慢就太容易了。)

当然,托管公司建议升级,我们做了,并且容量增加了一倍(从1,有时2个同时运行,到2个有时3个)。我现在得出结论,这种方法不可扩展,我们总是会遇到某种限制。

所以我一直在关注亚马逊网络服务,但要做到这一点需要改变Python设计的理念 - 它必须一直运行并以某种方式提供数据(据我所知)。

亚马逊的建议是Flask或类似的框架,但这意味着我要么有两个网络服务器,要么必须进行某种跨域数据传输,要么废弃我所做的 - 或者至少大量修改我的在Web服务器上运行的PHP / HTML / JS,以便它可以由Flask提供,并且全部由AWS托管。

除非有人可以建议不需要Web框架的另一种通信方式,否则我一直在考虑只是间歇地轮询MySQL数据库并处理任何新数据,或者将数据库迁移到Postgre,我相信,允许Python代码在数据库结构中运行,并使我能够在插入时触发(我相信MySQL中的用户定义触发器仅支持C / C ++)。

感谢您提出任何建议或指出我失踪的事情。

布莱尔

1 个答案:

答案 0 :(得分:0)

除了infinigrove的建议Pyro4适用于我的用例外,还有一个很好的tutorial可以提供一个简单的学习曲线。

Selcuk的建议可能也有效,但我仍然会遇到在分布式环境中运行其他服务器上的代码的问题。另外,如果在编写Python代码和编写PHP之间有选择,我恐怕每次都使用Python!

相关问题