美文网首页
python项目开发实战:第2章-开发web应用(留言板)

python项目开发实战:第2章-开发web应用(留言板)

作者: tf_dejs | 来源:发表于2017-08-06 10:50 被阅读0次

    message board

    usage:

    $ python guestbook.py(本机访问"http://127.0.0.1:8000")

    功能实现:

    网页中填写用户名,评论,会按照时间先后呈现出来

    主要做了以下工作:

    • 确定布局,编写必要页面
    • 编写保存提取主程序,并验证
    • 引入flask必要方法,展示页面模板
    • 设置过滤器转换一些字符
    • 安全检测
    • 成品

    编写必要页面"index.html", 相应的"main.css"

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>留言板</title>
    </head>
    <body>
    <h1>留言板</h1>
    <form action="/post" method="post">
        <p>请留言</p>
        <table>
            <tr>
                <th>名字</th>
                <td>
                    <input type="text" size="20" name="name"/>
                </td>
            </tr>
            <tr>
                <th>请留言</th>
                <td>
                    <textarea rows="5" cols="50" name="comment"></textarea>
                </td>
            </tr>
        </table>
        <p><button type="submit">提交</button></p>
    </form>
    <hr />
    <div class="entries-area">
        <h2>留言记录</h2>
        <h3>游客 的留言(2017/08/8):</h3>
        <p>留言内容留言内容</p>
        <h2>留言记录</h2>
        <h3>游客 的留言(2017/08/8):</h3>
        <p>留言内容留言内容</p>
    </div>
    
    </body>
    </html>
    

    编写主要程序"save_data"和"load_data"

    save_data执行保存任务:

    • 先检测数据库中有没有列表,没有的话定义为空,有的话加载出来;
    • 将新的参数保存进去(插入到最前面便于展示)
    • 保存到数据库中
    import shelve
    
    DATA_FILE = 'guestbook.dat'
    
    def save_data(name, comment, create_at):
        database = shelve.open(DATA_FILE)
        if greeting_list not in database:
            greeting_list = []
        else:
            greeting_list = database['greeting_list']
        greeting_list.insert(0, \
            {'name':name, 'comment':comment,'create_at: create_at'})
        database['greeting_list'] = greeting_list
        database.close()
    

    load_data()提取数据

    • get方法获取datbase中的数据,如果没有默认返回一个空列表
    • 返回greeting_list列表
    def load_data():
        database = shelve.open(DATA_FILE)
        greeting_list = database.get('greeting_list', [])
        database.close()
        return greeting_list
    

    引入flask必要方法,实现视图显示

    #!/usr/bin/env python3
    # coding:utf-8
    
    import shelve
    from flask import Flask, request, render_template, redirect, escape, Markup
    
    application = Flask(__name__)
    
    def save_data():
        ...
    
    
    def load_data():
        ...
    
    @application.route('/')
    def index():
        greeting_list = load_data()
        return render_template('index.html', greeting_list=greeting_list)
    
    if __name__ == '__main__':
        application.run('127.0.0.1', 8000, debug=True)
    
    

    创建post函数获取表单数据

    • "index.html"中表单定义的action="/post"
    • 从表单获取数据request.form.get()
    • 添加时间datetime.now()
    from datetime import datetime
    
    @application.route('/post', methods=['POST'])
    def post():
        name = request.form.get('name')
        comment = request.form.get('comment')
        create_at = datetime.now()  # 提交时间
        save_data(name, comment,create_at)
        redirect('/')
    

    修改"index.html"显示留言的部分

    添加模板语言,模板内使用一种特殊的描述方式,即模板语言.

    jinja2模板可以通过{%...%}的形式使用if或for等控制语句,植入有模板变量的部分用{{...}}的形式描述.比如用"for"循环需要有{%for...%}{%endfor%}

    <div class="entries-area">
        <h2>留言记录</h2>
        {% for greeting in greeting_list%}
        <h3>{{greeting.name}} 的留言{{greeting.create_at}}:</h3>
        <p>{{greeting.comment}}</p>
        {% endfor %}
        </div>
    

    调整模板的输出

    • 表单提交时,换行输入会被忽略,无法正常显示
    • 显示时间格式化

    添加模板过滤器

    @application.template_filter('nl2br')
    def nl2br_filter(s):
        return escape(s).replace('\n', Markup('<br />'))
    
    @application.template_filter('datetime_fmt')
    def datetime_fmt_filter(dt):
        return dt.strftime('%Y%m%d %H%M%S')
    

    验证跨站脚本攻击

    跨站脚本攻击(Cross Site Scripting, XSS)用户能在某些能以HTML形式显示输入内容的应用中,故意植入一些攻击性的脚本

    jiaja2模板在翻译字符时已忽略HTML的"<"和">"符号,因此能够成功避免XSS攻击

    验证
    <script>alert('NG')</script>

    相关文章

      网友评论

          本文标题:python项目开发实战:第2章-开发web应用(留言板)

          本文链接:https://www.haomeiwen.com/subject/nwyglxtx.html