精华内容
下载资源
问答
  • web创建form表单验证码

    千次阅读 2016-01-09 16:37:50
    web创建form表单验证码

    首先是工具类,用来绘制验证码

    public class Verify {
        //字符串,用来存储验证码中的字符
        private String string;
    
        public void setString(String string) {
            this.string = string;
        }
        public String getString() {
            return string;
        }
        //绘制验证码方法
        public void getVerify(int width , int height , OutputStream out){
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = image.createGraphics();
    
            // 绘制面板
            graphics.setColor(Color.white);
            graphics.fill3DRect(0, 0, width, height, true);
    
            // 边框大小,颜色
            graphics.setColor(Color.black);
            graphics.draw3DRect(0, 0, width-1, height-1, true);
    
            //随机存储四个字符
            String string = "qwertyuiopasdfghjklzxcvbnm1234567890";
            StringBuffer sb = new StringBuffer();
            Random random = new Random();
            String blank = "     ";
            for (int i = 0; i < 4; i++) {
                int next = random.nextInt(string.length());
                sb.append(string.charAt(next)+blank);
            }
    
            //绘制干扰线
            for(int i =0 ;i<4;i++){
                //创建线的坐标
                int x1 = random.nextInt(width);
                int y1 = random.nextInt(height);
                int x2 = random.nextInt(width);
                int y2 = random.nextInt(height);
                //创建颜色RGB三个范围值
                int a = random.nextInt(255);
                int b = random.nextInt(255);
                int c = random.nextInt(255);
                graphics.setColor(new Color(a,b,c));
                graphics.drawOval(x1, y1, x2, y2);
            }
    
            //绘制四个验证码
            graphics.setColor(Color.red);
            String str = sb.toString();
            graphics.drawString(str, width/8, height/2);
    
            //拆分字符
            StringBuffer buffer = new StringBuffer();
            String[] split = str.split(blank);
            for(String s : split){
                buffer.append(s);
            }
    
            //存储字符串
            setString(buffer.toString());
    
            try {
                ImageIO.write(image, "jpeg", out);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
    
    
        }
    
    }

    后台处理

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //设置response的数据格式
            response.setContentType("image/jpeg");  
            //画验证码
            Verify verify = new Verify();
            verify.getVerify(100, 50, response.getOutputStream());
        }

    jsp部分,给”看不清”设置超链接,同时加上点击事件,时间处理时变换img的src属性,为了避免读取缓存,给超链接附加上了时间+随机数

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>My JSP 'index.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <script type="text/javascript">
            function refresh(){
                //使用时间作为参数避免浏览器从缓存
                document.getElementById("img1").src="/day1116/Demo?now="+new Date()+""+Math.random();
            }
        </script>
      </head>
    
      <body>
        <img src="${pageContext.request.contextPath}/Demo" id="img1"/><a href="#" onclick="refresh()">看不清,换一张</a>
      </body>
    </html>
    展开全文
  • 简单创建易用的web表单
  • Web表单设计 创建高可用性的网页表单
  • Forms that work(Web表单设计 创建高可用性的网页表单)英文版.pdf )
  • 经实践检验的实用建议将帮助你远离设计失误,创建出美观、高效的表单。 可贵的设计方法和技巧是赢得数据准确性和顾客满意度的制胜法宝。 包含大量实例——从细节展现(如标签对齐方式、必填字段)到视觉设计(如创建...
  • 传统的表单处理解决方案已在台式机或本地服务器上运行。 本白皮书提出了另一种方法:通过Web服务进行表单处理。 这允许通过浏览器处理表单,移动表单处理以及从环境之外访问表单处理
  • JSON元数据创建者 使用架构和Web表单创建json文件
  • 渲染JS 用于基于 jQuery 轻松创建 Web 表单的 Javascript 库 何塞·里卡多·布斯托斯·莫利纳
  • WebAppCodeTemplates 可重复用于创建Web 表单网站的代码。
  • 从JSON文件创建表单 您可以将自己的JSON文件作为表单上传到数据库。 他们必须延伸.json和strucure必须是: { " name " : " String " , " questions " : [ " Array of questions " ] } 每个问题
  • JSP Web应用程序 在此使用JSP的三(3)个Web应用程序项目: 创建一个简单的JSP Web应用程序。 使用表单和3.创建JSP Web应用程序。3.创建将数据插入数据库的JSP Web应用程序。
  • Flask web表单

    千次阅读 2016-07-31 13:52:51
    为了能够处理 web 表单,我们将使用 Flask-WTF ,该扩展封装了 WTForms 并且恰当地集成进 Flask 中。 许多 Flask 扩展需要大量的配置,因此我们将要在 microblog 文件夹的根目录下创建一个配置文件以至于...

    这一章节已经开始头晕了,坡度有点大,需要补的知识有点多,先记录着

    为了能够处理 web 表单,我们将使用 Flask-WTF ,该扩展封装了 WTForms 并且恰当地集成进 Flask 中。

    许多 Flask 扩展需要大量的配置,因此我们将要在 microblog 文件夹的根目录下创建一个配置文件以至于容易被编辑。这就是我们将要开始的(文件config.py):

    CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'

    一个简单的config.py文件,还不知道什么意思,就知道是启用了CSRF功能,后面再百度查吧。这个config文件是建在应用程序根目录下

    创建完config.py文件以后,要告诉flask去读取他,所以要在__init__.py里面设置

    from flask import Flask
    
    app = Flask(__name__)
    app.config.from_object('config')    #函数的意思是,用app实例的config函数,调取名字为'config'的配置文件,这个字符串是可以自己定义的?
    
    from app import views
    在 Flask-WTF 中,表单是表示成对象, Form  类的子类。一个表单子类简单地把表单的域定义成类的变量。

    OpenID 登录仅仅需要一个字符串,被称为 OpenID。我们将在表单上提供一个 ‘remember me’ 的选择框,以至于用户可以选择在他们的网页浏览器上种植 cookie ,当他们再次访问的时候,浏览器能够记住他们的登录。

    以下是创建的form.py

    from flask.ext.wtf import Form                #导入Form类
    from wtforms import StringField, BooleanField   #导入文本输入框,导入Boolean选择框,这个Boolean框就是打钩或者不打勾的功能
    from wtforms.validators import DataRequired    #导入数据验证功能
    
    class LoginForm(Form):
        openid = StringField('openid', validators=[DataRequired()])  #定义LoginForm类,有2个属性,第一个openid,是一个文本输入框
        remember_me = BooleanField('remember_me', default=False)    #第二个remember_me是一个勾选框,告诉系统要不要勾选,默认不勾选

    做完表单模块后,我们要做一个HTML页面,来作为这个表单的渲染! login.html,也是放在templates下面的

    <!-- extend from base layout -->
    {% extends "base.html" %}      #这里extends意思是扩展自base.html,意思是调用login.html的时候,预先要读取base.html
    
    {% block content %}
    <h1>Sign In</h1>
    <form action="" method="post" name="login">  
        {{form.hidden_tag()}}                   #默认都有的,不知道什么意思,先放着
        <p>
            Please enter your OpenID:<br>    #文本显示Please enter.....  
            {{form.openid(size=80)}}<br>     #通过views.py里return render_template来渲染这个变量,form实例里面的openid属性(长度80)
        </p>                                  #<br>这个br挺常用,是换行的意思
        <p>{{form.remember_me}} Remember Me</p> #通过views.py里面render_template来渲染变量,form实例里面的remember属性,勾选框
        <p><input type="submit" value="Sign In"></p> #生成按钮,作用是submit,按钮显示的文本是Sign In
    </form>
    {% endblock %}

    接着我们要进行views.py也就是视图文件的修改了

    from flask import render_template, flash, redirect    #导入模块,flash函数,redirect函数
    from app import app
    from .forms import LoginForm   #导入LoginForm类
    
    # index view function suppressed for brevity
    
    @app.route('/login', methods = ['GET', 'POST'])   #这里'/login'表示的是,网页最后后缀是/login的时候,访问login.html页面
    def login():
        form = LoginForm()                 #生成form实例,给render_template渲染使用
        return render_template('login.html',
            title = 'Sign In',
            form = form)


    随后,再次更新views.py文件,添加flash和redirect功能,暂时还不知道flash这个什么意思。。

    @app.route('/login', methods = ['GET', 'POST'])
    def login():
        form = LoginForm()
        if form.validate_on_submit():  #调用form实例里面的validate_on_submit()功能,验证数据是否安全,如是返回True,默认返回False
            flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data))
            return redirect('/index') #如果数据符合要求,重定向到主页
        return render_template('login.html',  #如果数据不符合要求,则再次读取login.html页面
            title = 'Sign In',
            form = form)

    闪现的消息将不会自动地出现在我们的页面上,我们的模板需要加入展示消息的内容。我们将添加这些消息到我们的基础模板中,这样所有的模板都能继承这个函数。这是更新后的基础模板(文件 app/templates/base.html):

    <html>
      <head>
        {% if title %}
        <title>{{title}} - microblog</title>
        {% else %}
        <title>microblog</title>
        {% endif %}
      </head>
      <body>
        <div>Microblog: <a href="/index">Home</a></div>
        <hr>                                          #<hr>的意思是:添加一条水平线
        {% with messages = get_flashed_messages() %}  #Flask有一个函数是get...,赋予变量messages
        {% if messages %}
        <ul>
        {% for message in messages %}
            <li>{{ message }} </li>
        {% endfor %}
        </ul>
        {% endif %}
        {% endwith %}
        {% block content %}{% endblock %}
      </body>
    </html>


    现阶段的应用程序,如果表单提交不合理的数据将不会被接受。相反,会返回表单让用户提交合法的数据。

    然后,好像我们缺少了一个提示用户表单哪里出错了。幸运的是,Flask-WTF 也能够轻易地做到这一点

    下面修改login.html页面文件

    <!-- extend base layout -->
    {% extends "base.html" %}
    
    {% block content %}
      <h1>Sign In</h1>
      <form action="" method="post" name="login">
          {{ form.hidden_tag() }}
          <p>
              Please enter your OpenID:<br>
              {{ form.openid(size=80) }}<br>
              {% for error in form.openid.errors %}     #捕捉openid这个实例的errors信息
                <span style="color: red;">[{{ error }}]</span>  #用span截取这个error信息并渲染颜色
              {% endfor %}<br>
          </p>
          <p>{{ form.remember_me }} Remember Me</p>
          <p><input type="submit" value="Sign In"></p>
      </form>
    {% endblock %}


    下面修改一下config文件,1不知道为什么要修改要放在config文件,2不知道这OpenId的作用,先照样子敲吧。。。

    CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'
    
    OPENID_PROVIDERS = [
        { 'name': 'Google', 'url': 'https://www.google.com/accounts/o8/id' },
        { 'name': 'Yahoo', 'url': 'https://me.yahoo.com' },
        { 'name': 'AOL', 'url': 'http://openid.aol.com/<username>' },
        { 'name': 'Flickr', 'url': 'http://www.flickr.com/<username>' },
        { 'name': 'MyOpenID', 'url': 'https://www.myopenid.com' }]


    接着,我们就需要来修改我们的views.py文件了

    @app.route('/login', methods = ['GET', 'POST'])
    def login():
        form = LoginForm()
        if form.validate_on_submit():
            flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data))
            return redirect('/index')
        return render_template('login.html',
            title = 'Sign In',
            form = form,
            providers = app.config['OPENID_PROVIDERS'])
    其实我觉得,providers那个数据,不放在config里面也行,放在views里面,功能是一样一样的


    我们从配置中获取 OPENID_PROVIDERS,接着把它作为 render_template 中一个参数传入模板中。

    我敢确信你们已经猜到了,我们还需要多做一步来达到目的。我们现在就来说明如何在登录模板中渲染这些提供商的链接(文件app/templates/login.html):

    <!-- extend base layout -->
    {% extends "base.html" %}
    
    {% block content %}
    <script type="text/javascript">    #这里用到了javascript语言,这里只是设置方法,用于后面调用它
    function set_openid(openid, pr)    #方法名称是set_openid
    {
        u = openid.search('<username>') #在openid里面搜索是否有<username>
        if (u != -1) {                  #返回值是-1是表示没有找到,如果找到的话,返回字符的起始位置
            // openid requires username  #在JAVASCRIPT里面,双斜杠表示注释!!!
            user = prompt('Enter your ' + pr + ' username:') #user等于弹出框里面,用户输入的内容,pr在下面调用的时候会提到
            openid = openid.substr(0, u) + user  #刷新openid变量,openid=provider原始截取的网址加上用户输入的内容
        }
        form = document.forms['login'];
        form.elements['openid'].value = openid
    }
    </script>
    #这里补充一下Javascript的基础知识:openid.search('<username>')是指,在openid这个变量里面去搜索是否有<username>这个字符串,如果有的话返回他的起始位置,比如‘http://openid.aol.com/<username>'这个里面,他的起始位置就是22位                                    然后,下面openid.substr(0,u)是代表,截取openid的第0位到第22位,之后加上变量user                                                user=prompt('这里的字符串'),prompt是一个弹出框的作用并且让你输入内容而括号里面的内容是弹出框的提示语句,而user是记录你在输入框里面的输入内容!!!
    #Javascript基础知识第二点:form=document.forms['login']意思是,读取名字为login的表单!这里就是login.html                         form.elements['openid'].value我的理解是,索引form实例里面openid的值,来赋予openid。这个没理解透,先做下面的吧。
    <h1>Sign In</h1>
    <form action="" method="post" name="login">
        {{ form.hidden_tag() }}
        <p>
            Please enter your OpenID, or select one of the providers below:<br>
            {{ form.openid(size=80) }}
            {% for error in form.openid.errors %}
              <span style="color: red;">[{{error}}]</span>
            {% endfor %}<br>
            |{% for pr in providers %}
              <a href="javascript:set_openid('{{ pr.url }}', '{{ pr.name }}');">{{ pr.name }}</a> |      #激活Javascript脚本
            {% endfor %}
        </p>
        <p>{{ form.remember_me }} Remember Me</p>
        <p><input type="submit" value="Sign In"></p>
    </form>
    {% endblock %}


    下面两幅图就是针对上面JavaScript的脚本的讲解!





    这样,基本上大致的登录界面就成型了。。。。不容易啊。。。各种恶补。。。啥都不知道。。。























    展开全文
  • Web表单

    千次阅读 2017-12-18 17:48:24
    pip install flask-wtf ... ... 默认情况下,Flask-WTF能保护所有表单免受跨站请求伪造(Cross-Site Request Forgery,CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站时就会引发CSRF攻击。

    pip install flask-wtf

    flask-wtf(https://flask-wtf.readthedocs.io/en/stable/)

    4.1 跨站请求伪造保护

        默认情况下,Flask-WTF能保护所有表单免受跨站请求伪造(Cross-Site Request Forgery,CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站时就会引发CSRF攻击。

        为了实现CSRF保护,Flask_WTF需要程序设置一个密钥。Flask-WTF使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。设置密钥的方法如示例4-1所示。

    示例4-1 hello.py:设置Flask-WTF

    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'hard to guess string'

        app.config字典可用来存储框架、扩展和程序本身的配置变量。使用标准的字典句法就能把配置值添加到app.config对象中。这个对象还提供了一些方法,可以从文件或环境中导入配置值。

        SECRET_KEY配置变量是通用密钥,可在Flask和多个第三方扩展中使用。如其名所示,加密的强度取决于变量值的机密程度。不同的程序要使用不同的密钥,而且要保证其他人不知道以所用的字符串。

    4.2 表单类

        使用Flask-WTF时,每个Web表单都由一个继承自Form的类表示。这个类定义表单中的一组字段,每个字段都用对象表示。字段对象可附属一个或多个验证函数。验证函数来验证用户提交的输入值是否符合要求。

    示例4-2是一个简单的Web表单,包含一个文本段和一个提交按钮。

    示例4-2 hello.py:定义表单类

    #coding:utf8
    from flask import Flask
    from flask_wtf import Form
    from wtforms import StringField,SubmitField
    from wtforms.validators import Required
    
    class NameForm(Form):
      name = StringField('What is your name?',validators=[Required()])
      submit = SubmitField('Submit')
    

        这个表单中的字段都定义为类变量,类变量的值是相应字段类型的对象。在这个示例中,NameForm表单中有一个名为name的文本字段和一个名为submit的提交按钮。StringField类表示属性为type="text"的<input>元素。SubmitField类表示属性为type="submit"的<input>元素。字段构造函数的第一个参数是把表单渲染成HTML时使用的标号。

        StringField构造函数中的可选参数validators指定一个由验证函数组成的列表,在接受用户提交的数据之前验证数据。验证函数Required()确保提交的字段不为空。



    4.3 把表单渲染成HTML

        表单字段是可调用的,在模板中调用后会渲染成HTML。假设视图函数把一个NameForm实例通过参数form传入模板,在模板中可以生成一个简单的表单,如下所示:

     

    <form method="POST">
      {{ form.hidden_tag() }}
      {{ form.name.label }} {{ form.name() }}
      {{ form.submit() }}
    </form>

        当然,这个表单还很简陋。要想改进表单的外观,可以把参数传入渲染字段的函数,传入的参数会被转换成字段的HTML属性。例如,可以为字段指定id或class属性,然后定义CSS样式:

    <form method="POST">
      {{ form.hidden_tag() }}
      {{ form.name.label }} {{ form.name(id='my-text-field') }}
      {{ form.submit() }}
    </form>
        Flask-Bootstrap提供了一个非常高端的辅助函数,可以使用Bootstrap中预先定义好的表单样式渲染整个Flask-WTF表单,而这些操作只需一次调用即可完成。使用Flask-Bootstrap,上述表单可使用下面的方式渲染:

    {% import "bootstrap/wtf.html" as wtf %}
    {{ wtf.quick_form(form) }}

        wtf.quick_form()函数的参数为Flask-WTF表单对象,使用Bootstrap的默认样式渲染传入的表单。

    示例4-3 templates/index.html:使用Flask-WTF和Flask-Bootstrap渲染表单

    {% extends "base.html" %}
    {% import "bootstrap/wtf.html" as wtf %}
    {% block title %}Flasky{% endblock %}
    {% block page_content %}
    <div class="page-header">
    <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>
    </div>
    {{ wtf.quick_form(form) }}
    {% endblock %}

        如果没有定义模板变量name,则会渲染字符串"Hello,Stranger!"。内容区的第二部分使用wtf.quick_form()函数渲染NameForm对象。

    4.4 在视图函数中处理表单

    示例4-4 hello.py:路由方法

    #coding:utf8
    from flask import Flask,render_template
    from flask_wtf import Form
    from wtforms import StringField,SubmitField
    from wtforms.validators import Required
    from flask_bootstrap import Bootstrap
    app = Flask(__name__)
    bootstrap = Bootstrap(app)
    app.config['SECRET_KEY'] = 'hard to guess string'
    
    class NameForm(Form):
      name = StringField('What is your name?',validators=[Required()])
      submit = SubmitField('Submit')
    
    @app.route('/',methods=['GET','POST'])
    def index():
      name = None
      form = NameForm()
      if form.validate_on_submit():
        name = form.name.data
        form.name.data = ''
      return render_template('index.html',form=form,name=name)
    
    if __name__ == '__main__':
      app.run(debug=True)
    
        app.route修饰器中添加的methods参数告诉Flask在URL映射中把这个视图函数注册为GET和POST气你球儿的处理程序。如果没指定methods参数,就只能把视图函数注册为GET请求的处理程序。

        把POST加入方法列表很有必要,因为将提交表单作为POST请求进行处理更加便利。表单也可作为GET请求提交,不过GET请求没有主体,提交的数据以查询字符串的形式附加到URL中,可在浏览器的地址栏中看到。基于这个以及其他多个原因,提交表单大都作为POST请求进行处理。

        局部变量用来存放表单中输入的有效名字,如果没有输入,其值为None。如上述代码所示,在视图函数中创建一个NameForm类实例用于表示表单。提交表单后,如果数据能被所有验证函数接受,那么validate_on_submit()方法的返回值为True,否则返回False。这个函数的返回值决定是重新渲染表单还是处理表单提交数据。

        用户第一次访问程序时,服务器会收到一个没有表单数据的GET请求,所以validate_on_submit()将返回False。if语句的内容将被跳过,通过渲染模板处理请求,并传入表单对象和值为None的name变量作为参数。用户会看到浏览器中显示了一个菜单。

        用户提交表单后,服务器收到了一个包含数据的POST请求。validate_on_submit()会调用name字段上附属的Required()验证函数。如果名字不为空,就能通过验证,validate_on_submit()返回True。现在,用户输入的名字可通过字段的data属性获取。在if语句中,把名字赋值给局部变量name,然后再把data属性设为空字符串,从而清空表单字段。最后一行调用render_template()函数渲染模板,但这一次参数name的值为表单中输入的名字,因此会显示一个针对该用户的欢迎消息。



    4.5 重定向和用户会话

        用户在输入名字提交表单,然后点击浏览器的刷新按钮,会看到一个莫名其妙的警告,要求在再次提交表单之前进行确认。之所以出现这种情况,是因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求。如果这个请求是一个包含表单数据的POST请求,刷新页面后会再次提交表单。大多数情况下,这并不是理想的处理方式。

        基于这个原因,最好别让Web程序把POST请求作为浏览器发送的最后一个请求。

        这种需求的实现方式是,使用重定向作为POST请求的响应,而不是使用常规响应。重定向是一种特殊的响应,响应内容是URL,而不是包含HTML代码的字符串。浏览器收到这种响应时,会向重定向的URL发起GET请求,显示页面的内容。这个页面的加载可能要多花几微妙,因为要先把第二个请求发送给服务器。除此之外,用户不会察觉到有什么不同。现在,最后一个请求是GET请求,所以刷新命令能像预期的那样正常使用了。这个技巧称为Post/重定向/Get模式。

        但这种方法会带来另一个问题。程序处理POST请求时,使用form.name.data获取用户输入的名字,可是一旦这个请求结束,数据也就丢失了。因为这个POST请求使用重定向处理,所以程序需要保存输入的名字,这样重定向后的请求才能获得并使用这个名字,从而构建真正的响应。

        程序可以把数据存储在用户会话中,在请求之间"记住"数据。用户会话是一种私有存储,存在于每个连接到服务器的客户端中。

    示例4-5是index()视图函数的新版本、实现了重定向和用户会话。

    示例4-5 hello.py:重定向和用户会话

     

    #coding:utf8
    from flask import Flask,render_template,session,redirect,url_for
    from flask_wtf import Form
    from wtforms import StringField,SubmitField
    from wtforms.validators import Required
    from flask_bootstrap import Bootstrap
    app = Flask(__name__)
    bootstrap = Bootstrap(app)
    app.config['SECRET_KEY'] = 'hard to guess string'
    
    class NameForm(Form):
      name = StringField('What is your name?',validators=[Required()])
      submit = SubmitField('Submit')
    
    @app.route('/',methods=['GET','POST'])
    def index():
      form = NameForm()
      if form.validate_on_submit():
        session['name'] = form.name.data
        return redirect(url_for('index'))
      return render_template('index.html',form=form,name=session.get('name'))
    
    if __name__ == '__main__':
      app.run(debug=True)
    

        url_for()函数的第一个且唯一必须指定的参数是端点名,即路由的内部名字。默认情况下,路由的端点是相应视图函数的名字。在这个示例中,处理跟地址的视图函数是index(),因此传给url_for()函数的名字是index。

    4.6 Flash消息

        一个典型的例子是,用户提交了有一项错误的登录表单后,服务器发回的响应重新渲染了登录表单,并在表单上显示了一个消息,提示用户名或者密码错误。

    示例4-6 hello.py:Flash消息

    #coding:utf8
    from flask import Flask,render_template,session,redirect,url_for,flash
    from flask_wtf import Form
    from wtforms import StringField,SubmitField
    from wtforms.validators import Required
    from flask_bootstrap import Bootstrap
    app = Flask(__name__)
    bootstrap = Bootstrap(app)
    app.config['SECRET_KEY'] = 'hard to guess string'
    
    class NameForm(Form):
      name = StringField('What is your name?',validators=[Required()])
      submit = SubmitField('Submit')
    
    @app.route('/',methods=['GET','POST'])
    def index():
      form = NameForm()
      if form.validate_on_submit():
        old_name = session.get('name')
        if old_name is not None and old_name != form.name.data:
          flash('Looks like you have changed you name!')
        session['name'] = form.name.data
        return redirect(url_for('index'))
      return render_template('index.html',form=form,name=session.get('name'))
    
    if __name__ == '__main__':
      app.run(debug=True)
    

    示例4-7 templates/base.html:渲染Flash消息

    {% block content %}
    <div class="container">
    {% for message in get_flashed_messages() %}
    <div class="alert alert-warning">
    <button type="button" class="close" data-dismiss="alert">×</button>
    {{ message }}
    </div>
    {% endfor %}
    {% block page_content %}{% endblock %}
    </div>
    {% endblock %}
    
























    展开全文
  • Java Web注册表单编写

    千次阅读 2019-03-11 20:10:24
    1.要做下列的这样一个表单信息: 2.方法主体里面添加表单 &amp;lt; form action=“提交地址” method=“post”&amp;gt; 表单内容(包括按钮,输入框,选择框等)&amp;lt; /form&amp;gt; 我们...

    编写注册表单

    1.要做下列的这样一个表单信息:
    在这里插入图片描述
    2.方法主体里面添加表单 < form action=“提交地址” method=“post”> 表单内容(包括按钮,输入框,选择框等)< /form>

    我们可以看到在测试中的结果:
    在这里插入图片描述
    3.接下来就是在表单里面添加标签
    (1)账号密码都是text:

    输入账号(文本框):<input type="text"><br>
    输入密码(密码框):<input type="text"><br>
    

    在这里插入图片描述
    (2)性别设置为单选按钮:radio

    选择性别(单选按钮):<!-- 最多只能选择一项 -->
         	<input type="radio"name="sex" >男
         	<input type="radio"name="sex" checked>女<br><!-- checked为默认勾选上 -->
    

    在这里插入图片描述
    (3)爱好设置为复选框:checkbox

    选择爱好(复选框):<!-- 可以有多项选择 -->
    		<input type="checkbox" checked="checked" >唱歌
    		<input type="checkbox"  >跳舞
    		<input type="checkbox"  >打球
    		<input type="checkbox" checked="checked"  >看书<br><!-- checked为默认勾选上 -->
    		
    

    在这里插入图片描述
    (4)注册设置为提交类型:submit

    <input type="submit" value="注册">
    

    (5)清空设置为重置类型:reset

    <input type="reset" value="清空">
    
    

    (6)普通按钮设置为button类型

    <input type="button" value="普通按钮">
    
    

    在这里插入图片描述
    4.测试
    (1)填入信息,点击注册发现:
    在这里插入图片描述
    因为没有设置跳转的页面。
    (2)填入信息,点击清空发现:
    在这里插入图片描述
    一个简单的表单注册信息就完成了。

    展开全文
  • 英文版  精心设计的表单,能让用户感到心情舒畅,愉快地注册、付款和进行内容创建和管理,这是促成网上商业成功的秘密武器。
  • vue element web 表单设计工具

    万次阅读 2020-12-07 22:22:17
      项目名 dw-form-making,基于 element-ui 组件库的Web表单设计工具。   项目技术栈vue、vue-cli3,可视化设计element-ui输入框、选择器、单选框等控件组成的Form表单,配置表单字段、标签、校验规则等。  ...
  • 超级最早支持创建项目表格。现在支持创建普通表格啦。所谓普通表格,就像Excel表那样,用来输入各种数据。 截图如下: ...与项目表格一样,创建的普通表格可以共享给他人、可以发布表单让他们填写数据。
  • 创建的一个asp.net核心Web表单应用程序用于了解Winforms,Webforms和WPF,我于2019年初创建了此应用程序,最近\开始返回以清理代码并进行改进,管理员将能够访问管理单元,而Resultmanager将是能够访问“管理结果...
  • web表单重复提交验证

    千次阅读 2016-01-09 15:17:56
    web表单重复提交验证
  • web表单web应用中最基本的构建要素,我们将通过表单来实现用户发帖和应用登录功能。 完成本章内容你需要基于前面章节完成的微博应用代码,请确认这些代码已安装并能正常运行。 配置 Flask-WTF是WTForms项目的Flask...
  • JAVA Web防止表单重复提交实例

    千次阅读 2013-09-21 09:27:09
    防止表单重复的提交,解决实际问题
  • WEB基本表单及代码(HTML)

    千次阅读 2014-09-23 20:01:00
    由于前两年csdn内容整改导致之前的博客内容排版都错乱了,于是我将内容进行修复,同时放到我的个人博客网站里面,网站才建立...表单也是一个html标签,不过他允许提交数据到后台,于是,我开始从事web开发。   ...
  • Web表单生成器

    千次阅读 2019-03-27 19:59:00
    Web表单生成器   在项目的实际开发中,经常需要设计各种各样表单。直接编写HTML表单虽然简单,但修改、维护相对麻烦。    因此,可以利用PHP实现一个Web表单生成器,使其可以根据具体的需求定制不同功能的...
  • 使用Flask-WTF时,每个web表单都由继承自Form的类表示。这个类定义表单中的一组字段,每个字段都用对象表示。字段对象可以附属一个或多个验证函数。验证函数用来验证用户所提交的数据是否符合要求。 hello.py:定义...
  • 做一个简单的web表单,当你输入用户名的时候会产生相应的欢迎信息,效果展示如下: 其实空字符提交时会出现一行Resquired()函数产生的提醒文字,截图时点击屏幕就消失了。。。。 看到导航栏里有两个选项,在...
  • 轻松创建Web表单,然后将它们下载为zip以便轻松插入您的网站。 在线演示。 无需安装。 创建一个多页的Web表单并将其作为Zip下载,以插入到Web服务器中。 http://phpformgen.sourceforge.net/new_demo/phpformgen/...
  • Struts动态表单创建

    千次阅读 2014-09-25 13:55:40
    在struts中如何实现动态表单创建 (1)第一步:创建一个简单的注册页面: u: p: (2)第二步:在struts-config.xml文件中配置动态表单: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 217,427
精华内容 86,970
关键字:

web创建表单