Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GAE/Python弹出警报的最佳实践?_Python_Html_Google App Engine - Fatal编程技术网

GAE/Python弹出警报的最佳实践?

GAE/Python弹出警报的最佳实践?,python,html,google-app-engine,Python,Html,Google App Engine,我需要有一个警告弹出在谷歌应用程序引擎时,用户输入的值,将创建一个重复的项目。最好的方法是什么 我找到了一种方法,但这远远不够优雅: 当用户输入一个重复的项目代码时,我会显示一个新页面“error message.html”,它向用户解释发生了什么,并提供一个“back”按钮。然而,我宁愿在“addproject.html”页面上显示一个警报。Javascript可能是个好主意,但它无法在数据库中验证,因此没有任何用处 GAE/Python中显示由代码触发的警报框的最佳实践是什么 因此,任何帮助

我需要有一个警告弹出在谷歌应用程序引擎时,用户输入的值,将创建一个重复的项目。最好的方法是什么

我找到了一种方法,但这远远不够优雅:

当用户输入一个重复的项目代码时,我会显示一个新页面“error message.html”,它向用户解释发生了什么,并提供一个“back”按钮。然而,我宁愿在“addproject.html”页面上显示一个警报。Javascript可能是个好主意,但它无法在数据库中验证,因此没有任何用处

GAE/Python中显示由代码触发的警报框的最佳实践是什么

因此,任何帮助或建议都将不胜感激

谢谢

代码:

我现在正在开发的应用程序是一个简单的项目经理工具。我正在使用GAE附带的webapp2

当前工作流: 1) 在AddProject中,我向用户显示一个页面以输入新的项目数据(“add project.html”)。该页面基于JINJA模板。用户填写数据并单击submit。 2) Submit调用SaveAddedProject,检查NDB中是否存在项目代码。 3) 如果NDB中尚未包含项目代码,则新项目将保存在NDB中,代码将重新指向“常规项目”页面。 4) 如果项目存在,我会显示一个名为“error message.html”的新页面,它告诉用户他/她正在输入一个重复的值,并提供一个返回按钮。然后用户可以更改他的值并重试

型号:

class Project(ndb.Model):
  # Models and individual Project entry
  proj_id = ndb.StringProperty(required = True)
  proj_desc = ndb.StringProperty(required = True)
  proj_status = ndb.StringProperty(required = True)
调度员:

class AddProject(webapp2.RequestHandler):
# Displays template to fill-in data for new project, 
# then calls SaveAddedProject
  def post(self):
    user = users.get_current_user() # We use Google's login system
    logout_url = users.create_logout_url(self.request.url)
    template_values = {
        'user_id': user,
        'logout_url': logout_url,
    }

    template = JINJA_ENVIRONMENT.get_template('add-project.html')
    self.response.write(template.render(template_values))

class SaveAddedProject(webapp2.RequestHandler):
# Saves a new project. Is called from AddProject
  def post(self):
    proj_id_str = self.request.get('proj_id')
    proj_desc_str = self.request.get('proj_desc')
    proj_status_str = self.request.get('proj_status')
    # The add template already validates required fields aren't empty :-)

    # Verify we don't duplicate the project_id
    pq = Project.query(ancestor = get_projects_key())
    pq = pq.filter(Project.proj_id == proj_id_str)
    pq_result = pq.fetch(limit=1)
    if len(pq_result) > 0:  # Notify the user
            template_values = {'error_message': 'Project ID ' + proj_id_str + ' already exists',
            }
            template = JINJA_ENVIRONMENT.get_template('error-message.html')
            self.response.write(template.render(template_values))
    else:
        # Create new project
        project = Project(parent=get_projects_key()) # Use root ancestor key  
        # Populate fields, save to NDB
        project.proj_id = proj_id_str
        project.proj_desc = proj_desc_str
        project.proj_status = proj_status_str
        project.put()
        self.redirect('/projects')
add-project.HTML的HTML:

<!DOCTYPE html>
{% autoescape true %}
<html>
  <head>
    <link type="text/css" rel="stylesheet" href="/stylesheets/pages.css" />
    <title>Action List</title>
    <script>
      function validateForm() {
    var count = 0;
    var x = document.forms["form1"]["proj_id"].value;
    if (x == null || x == "") {
       count = 1;
       }
     var x = document.forms["form1"]["proj_desc"].value;
     if (x == null || x == "") {
       count = 1;
       }
    if (count == 1) {
       document.getElementById('AlertMsg').innerHTML = '<font color="red">Please fill in all fields marked with *</font>';
        return false;
       }
     }
</script>
</head>
<body>
  <h2>Add Project</h2>
  <br>
  <b>User: {{ user_id }} </b>
  <br><br>
  <form name="form1" action="/p-save-add" onsubmit="return validateForm()" method="post">
    <div>
      ID * <input value="" name="proj_id" size="15">
     Description * <input value="" name="proj_desc" size="50">
     Status: <select name='proj_status'>
        <option value='Open'>Open</option>
        <option value='Closed'>Closed</option>
      </select>
    </div>   
    <br>
    <div><input type="submit" value="Save"></div>
  </form>
  <br>
  <br>
  <b id='AlertMsg' > </b>
</body>
</html>
{% endautoescape %}

{%autoescape true%}
行动清单
函数validateForm(){
var计数=0;
var x=document.forms[“form1”][“proj_id”]值;
如果(x==null | | x==“”){
计数=1;
}
var x=文件.forms[“form1”][“proj_desc”]值;
如果(x==null | | x==“”){
计数=1;
}
如果(计数=1){
document.getElementById('AlertMsg')。innerHTML='请填写所有标有*'的字段;
返回false;
}
}
添加项目

用户:{{User_id}

ID* 说明* 地位: 打开 关闭


{%endautoescape%}
error-message.HTML的HTML:

<!DOCTYPE html>
{% autoescape true %}

<script>
function goBack() {
  window.history.back();
}
</script>


<html>
  <head>
    <title>ActionList</title>
     <link type="text/css" rel="stylesheet"      href="/stylesheets/messages.css" />
  </head>

<body>
  <h3> Sorry, an error ocurred!</h3>    
  {{ error_message }}
  <br>
  <br>
  <button onclick="goBack()">Back</button>
</body>

{%autoescape true%}
函数goBack(){
window.history.back();
}
行动清单
对不起,发生了一个错误!
{{error_message}}


返回

{%endautoescape%}

您应该同时使用这两种方法。从安全角度(验证需要在服务器上进行,因为表单可以绕过JavaScript中的验证)和兼容性角度来看,仅显示错误页面的方法是处理问题的正确方法(浏览器可能会禁用JavaScript并在没有JavaScript的情况下访问表单)

但是,从用户体验的角度来看,在与表单相同的页面上获得验证错误是很好的,而不必导航到某个新页面来查看错误(并且必须再次填写表单)。请注意,即使必须在服务器上进行验证检查,您仍然可以通过JavaScript在UI中执行此验证;您可以通过使用提交JavaScript表单来执行此操作,以便您的JavaScript代码能够查看/处理响应。然后,您可以让响应消息将此指示为各种可能的验证之一错误


例如,查看“反馈”机制是如何工作的;您会注意到表单的一个版本在没有JavaScript的情况下工作(“反馈”页面),但如果启用了JavaScript,则该按钮实际上会在JavaScript中打开一个对话框,该对话框使用XMLHttpRequest提交表单,如果表单未能提交,则会在对话框中直接报告错误,而不会导航到新页面(通过读取响应的状态代码或查看服务器返回的JSON响应中包含的详细错误消息)。

感谢您的宝贵反馈。我将开始处理双重解决方案。