0

我试图在单击按钮时打印随机值start并通过单击按钮停止它stop。该Start按钮按预期工作,即在单击时打印随机值,但是当stop单击按钮时,它不会跳出循环(尽管它进入该stop部分)并继续打印随机值。如何停止打印随机值并重新开始。?

我的代码的简短摘要:- 在 vi​​ews.py 中,signal请求变量,然后将其发送到generate_random_temperature生成随机数的函数。生成数字工作正常,但它无法停止生成数字的服务。

我怎样才能阻止它?

HTML 文件

    <form type = "POST">
        {% csrf_token %}    
        <input type="text" placeholder = "Enter City Name" id = "city_name">
        <input type="submit" value = "start" id="submit">
        <input type="reset" value = "Stop" id="stop">

    </form>

JS文件

$(function(){

    $("#start").click(function (event) {
        event.preventDefault();
        $.ajax({
            type: "POST",
            url: "/dashboard/",
            data : { 'city_name' : $("#city_name").val(),
                     'signal' : "True"
                   },

               });
    });

    $("#stop").click(function (event) {
        event.preventDefault();
        $.ajax({
            type: "POST",
            url: "/dashboard/",
            data : { 'city_name' : $("#city_name").val(),
                     'signal' : "False"
                   },

               });
    });
});

服务.py

def generate_random_temperature(city_name, status):

    city = City.objects.filter(city_name = city_name)

    for data in city:
        status = data.status

    print status
    if status == "True" :
        while(1):
            print randrange(1,51)
            time.sleep(5)   
    elif status == "False" :
        print "Exiting"

视图.py

def dashboard(request):

if request.is_ajax():
    status = request.POST['status']
    city_name = request.POST['city_name']

    city = City.objects.filter(city_name = city_name)
    for data in city:
        data.status = status
        data.save()
    generate_random_temperature(city_name, status)


ctx = {}
return render_to_response('dashboard/dashboard.html',ctx, context_instance = RequestContext(request))

输出

True             // When Start button is clicked, service is started
25
13
False           // When Stop button is clicked, it enters the else section, prints Exiting , but then again starts printing numbers. It does not breaks out of the while loop.
Exiting
[23/Aug/2013 05:38:33] "POST /dashboard/ HTTP/1.1" 200 2363
45
25
26
31
4

2 回答 2

0

您的逻辑/理解不正确。

您编写服务的方式,当浏览器发送启动请求时,它永远不会得到对该请求的响应。简而言之,该请求的请求处理程序dashboard()视图永远不会返回响应。那是因为generate_random_temperature()当它被调用时永远不会返回signal=True

您必须考虑一些不同的逻辑来启动服务并从函数返回,可能是不同的线程。并且信号应该在线程/进程之间共享,具体取决于您的部署(每个请求作为 cgi 运行,它可能作为 web 服务器中的不同进程/线程运行)。

于 2013-08-23T11:08:06.833 回答
0

当第一个请求启动服务时,该服务将永远持续下去。它根本没有办法跳出循环,因为在对 function 的调用中signal无法更改。

第二次调用确实会进入stop分支,但这无关紧要,因为最初的调用仍在继续。

您需要的是一些可以在循环外设置并在其中检查的共享数据。也许您可以使用数据库:存储一个“状态”对象,并在stop发送时将其设置为“停止”。然后在生成器的每个循环中,您都需要从数据库中获取该对象,并检查其状态。

(如果你能保证你在单线程环境中运行,那么这里使用全局变量会更好,但 Django 部署不太适合这种情况。)

于 2013-08-23T11:25:45.717 回答