在Python脚本中调用Rails 4 param

Call Rails 4 param in Python script

我尝试在Python脚本中使用来自Rails控制器的表单输入。我的Rails(4.2.1版)应用程序中有一个接受URL的表单,然后我想在Python脚本中使用该URL。我不熟悉Rails,也不知道该怎么做。我的应用程序已经可以接受表单输入并在页面上呈现它们,还可以调用一个python脚本并运行它,但是我需要将它们链接在一起。

以下是迄今为止的控制器代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class ContestsController < ApplicationController
  def index
    value = %x(python /Users/my/Desktop/rails_test.py 2>&1)
    render :text => value
    @contests = Contest.all
  end

  def new
    @contest = Contest.new
  end

  def create
    @contest = Contest.new(contest_params)

    if @contest.save
      redirect_to contests_url
    else
      render 'new'
    end
  end

  private

  def contest_params
    params.require(:contest).permit(:site, :contest_url)
  end
end

我的python rails_test.py脚本是:

1
2
3
4
5
#!/bin/bash

print"Python script works!"
#url = last :contest_url param from rails app
#print url

试试"1":

我将Rails代码修改为:

1
value = %x(python /Users/jdesilvio/Desktop/rails_test.py #{Shellwords.escape(params[:contest_url])} 2>&1)

我将python脚本修改为:

1
2
3
4
5
6
#!/Users/me/anaconda/bin/python2.7 python

import sys

print"Python script works!"
print"Url:", sys.argv[1]

输出是:

1
Python script works! Url:

我的形式是:

1
2
3
4
5
6
7
8
9
10
11
<%= form_for @contest do |f| %>
 
    <%= f.label :site %>
    <%= f.text_field :site %>
 
 
    <%= f.label :contest_url %>
    <%= f.text_field :contest_url %>
 
  <%= f.submit %>
<% end %>


你可以把它们作为命令行参数传递给你的脚本。%x做字符串插入,但是你需要小心并验证输入,因为有人可能会传递params[:contest_url] =" && rm -rf /"或类似于你脚本的东西,并导致你出现问题(从不信任用户输入),所以shellwords(http://ruby-doc.org/stdlib-2.0/libdoc/shellwords/rdoc/shellwords.html)类可以帮助你。也许有点像。

1
value = %x(/Users/my/Desktop/rails_test.py #{Shellwords.escape(params[:site])} #{Shellwords.escape(params[:contest_url])} 2>&1)

然后让您的python脚本通过stdin读取值

1
2
3
4
5
#!/usr/bin/env python
import sys

print"Site:", sys.argv[1]
print"Url:", sys.argv[2]

我让您的python脚本shebang调用/usr/bin/env python,但是如果python不在您的rails应用程序运行的用户路径中,那么您可能需要完整的路径。另外,如果您将它作为python可执行文件的参数调用,则不需要在python脚本顶部使用/bin/bash