>

百货店介绍编辑作用,文件下载

- 编辑:www.bifa688.com -

百货店介绍编辑作用,文件下载

    本次我们来看下文件下载和上传的操作。首先是上传,HTML设置上传文件的表单供给设置enctype 属性为 multipart/form-data,代码如下所示:

python3 CGI基础 原稿链接

  • #### 什么是CGI

    CGI 目前由NCSA维护,NCSA定义CGI如下:

    CGI(Common Gateway Interface),通用网关接口,它是1段程序,运转在服务器上如:HTTP服务器,提供同客户端HTML页面包车型地铁接口。

  • #### 网页浏览

    为了更加好的领悟CGI是怎么着行事的,我们能够从在网页上点击2个链接或UCR-VL的流水生产线:

    • 一、使用你的浏览器访问UPAJEROL并连接到HTTP web 服务器。
    • 2、Web服务器收到到请求新闻后会分析U汉兰达L,并查找访问的文本在服务器上是还是不是留存,假使存在再次来到文件的剧情,否则重回错误信息。
    • 三、浏览器从服务器上接受音讯,并展现接收的文件大概错误音信。

    CGI程序能够是Python脚本,PEENCOREL脚本,SHELL脚本,C或许C 程序等。

  • #### CGI架构

    browser

    html javascript css

    web sever

    database 执行cgi file system

  • #### web服务器帮衬及布局

    在你进行CGI编制程序前,确定保障您的Web服务器援救CGI及曾经布置了CGI的管理程序。

    Apache 支持CGI 配置:

    设置好CGI目录:

    ScriptAlias /cgi-bin/ /var/www/cgi-bin/
    

    装有的HTTP服务器施行CGI程序都保存在三个先行安排的目录。这几个目录被可以称作CGI目录,并遵循规矩,它被取名叫/var/www/cgi-bin目录。

    CGI文件的扩张名称为.cgi,python也能够选取.py扩张名。

    私下认可处境下,Linux服务器配置运维的cgi-bin目录中为/var/www。

    如若您想内定别的运营CGI脚本的目录,能够修改httpd.conf配置文件,如下所示:

    <Directory "/var/www/cgi-bin">
       AllowOverride None
       Options  ExecCGI
       Order allow,deny
       Allow from all
    </Directory>
    

    在 AddHandler 中增添 .py 后缀,那样大家就足以访问 .py 结尾的 python 脚本文件:

    AddHandler cgi-script .cgi .pl .py
    
  • #### 第一个CGI程序

    我们运用Python创设第二个CGI程序,文件名叫hello.py,文件位于/var/www/cgi-bin目录中,内容如下:

    #!/usr/bin/python3
    
    print ("Content-type:text/html")
    print ()                             # 空行,告诉服务器结束头部
    print ('<html>')
    print ('<head>')
    print ('<meta charset="utf-8">')
    print ('<title>Hello Word - 我的第一个 CGI 程序!</title>')
    print ('</head>')
    print ('<body>')
    print ('<h2>Hello Word! 我是来自菜鸟教程的第一CGI程序</h2>')
    print ('</body>')
    print ('</html>')
    

    文件保留后修改 hello.py,修改文件权限为 75伍:

    chmod 755 hello.py 
    
  • #### http头部

    hello.py文件内容中的" Content-type:text/html"即为HTTP底部的1有些,它会发送给浏览器告诉浏览器文件的内容类型。

    HTTP尾部的格式如下:

    HTTP 字段名: 字段内容
    

    例如:

    Content-type: text/html
    

    以下表格介绍了CGI程序中HTTP底部平日应用的消息:

    描述
    Content-type: 请求的与实体对应的MIME信息。例如: Content-type:text/html
    Expires: Date 响应过期的日期和时间
    Location: URL 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源
    Last-modified: Date 请求资源的最后修改时间
    Content-length: N 请求的内容长度
    Set-Cookie: String 设置Http Cookie
  • #### CGI遇到变量

    不无的CGI程序都吸收接纳以下的情形变量,那些变量在CGI程序中发挥了最主要的效应:

    变量名 描述
    CONTENT_TYPE 这个环境变量的值指示所传递来的信息的MIME类型。目前,环境变量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示数据来自于HTML表单。
    CONTENT_LENGTH 如果服务器与CGI程序信息的传递方式是POST,这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。
    HTTP_COOKIE 客户机内的 COOKIE 内容。
    HTTP_USER_AGENT 提供包含了版本数或其他专有数据的客户浏览器信息。
    PATH_INFO 这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。
    QUERY_STRING 如果服务器与CGI程序信息的传递方式是GET,这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面,两者中间用一个问号'?'分隔。
    REMOTE_ADDR 这个环境变量的值是发送请求的客户机的IP地址,例如上面的192.168.1.67。这个值总是存在的。而且它是Web客户机需要提供给Web服务器的唯一标识,可以在CGI程序中用它来区分不同的Web客户机。
    REMOTE_HOST 这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。
    REQUEST_METHOD 提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。
    SCRIPT_FILENAME CGI脚本的完整路径
    SCRIPT_NAME CGI脚本的的名称
    SERVER_NAME 这是你的 WEB 服务器的主机名、别名或IP地址。
    SERVER_SOFTWARE 这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号。例如,上面的值为Apache/2.2.14(Unix)

    以下是三个简约的CGI脚本输出CGI的遭遇变量:

    #!/usr/bin/python3
    
    import os
    
    print ("Content-type: text/html")
    print ()
    print ("<meta charset="utf-8">")
    print ("<b>环境变量</b><br>")
    print ("<ul>")
    for key in os.environ.keys():
        print ("<li>0s  : %s </li>" % (key,os.environ[key]))
    print ("</ul>")
    

    将以上点保存为 test.py ,并修改文件权限为 75⑤,实行:

  • #### get和post方法

    浏览器客户端通过二种方法向服务器传递音讯,那三种办法正是 GET 方法和 POST 方法。

    • ##### 使用get方法传输数据

      GET方法发送编码后的用户音信到服务端,数据音信包括在伸手页面包车型大巴U奥迪Q5L上,以"?"号分割, 如下所示:

      http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
      

      至于 GET 请求的任何一些注解:

      • GET 请求可被缓存
      • GET 请求保留在浏览器历史记录中
      • GET 请求可被收藏为书签
      • GET 请求不应在拍卖敏感数据时行使
      • GET 请求有长度限制
      • GET 请求只应当用于取回数据
    • ##### 轻易实例

      /cgi-bin/test.py?name=菜鸟教程&url=http://www.runoob.com
      

      以下为hello_get.py文件的代码:

      #!/usr/bin/python3
      
      # CGI处理模块
      import cgi, cgitb 
      
      # 创建 FieldStorage 的实例化
      form = cgi.FieldStorage() 
      
      # 获取数据
      site_name = form.getvalue('name')
      site_url  = form.getvalue('url')
      
      print ("Content-type:text/html")
      print ()
      print ("<html>")
      print ("<head>")
      print ("<meta charset="utf-8">")
      print ("<title>菜鸟教程 CGI 测试实例</title>")
      print ("</head>")
      print ("<body>")
      print ("<h2>%s官网:%s</h2>" % (site_name, site_url))
      print ("</body>")
      print ("</html>")
      

      文件保留后修改 hello_get.py,修改文件权限为 755:

      chmod 755 hello_get.py 
      
  • ##### 使用post方法传递数据

    应用POST方法向服务器传递数据是更安全可靠的,像一些机警新闻如用户密码等须求运用POST传输数据。

    以下同样是hello_get.py ,它也得以管理浏览器提交的POST表单数据:

    #!/usr/bin/python3
    
    # CGI处理模块
    import cgi, cgitb 
    
    # 创建 FieldStorage 的实例化
    form = cgi.FieldStorage() 
    
    # 获取数据
    site_name = form.getvalue('name')
    site_url  = form.getvalue('url')
    
    print ("Content-type:text/html")
    print ()
    print ("<html>")
    print ("<head>")
    print ("<meta charset="utf-8">")
    print ("<title>菜鸟教程 CGI 测试实例</title>")
    print ("</head>")
    print ("<body>")
    print ("<h2>%s官网:%s</h2>" % (site_name, site_url))
    print ("</body>")
    print ("</html>")
    

    以下为表单通过POST方法(method="post")向服务器脚本 hello_get.py 提交数据:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    <form action="/cgi-bin/hello_get.py" method="post">
    站点名称: <input type="text" name="name">  <br />
    
    站点 URL: <input type="text" name="url" />
    <input type="submit" value="提交" />
    </form>
    </body>
    </html>
    </form>
    
  • ##### 通过CGI程序传递checkbok数据

    checkbox用于提交三个或许几个挑选数据,HTML代码如下:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    <form action="/cgi-bin/checkbox.py" method="POST" target="_blank">
    <input type="checkbox" name="runoob" value="on" /> 菜鸟教程
    <input type="checkbox" name="google" value="on" /> Google
    <input type="submit" value="选择站点" />
    </form>
    </body>
    </html>
    

    以下为 checkbox.py 文件的代码:

    #!/usr/bin/python3
    
    # 引入 CGI 处理模块 
    import cgi, cgitb 
    
    # 创建 FieldStorage的实例 
    form = cgi.FieldStorage() 
    
    # 接收字段数据
    if form.getvalue('google'):
       google_flag = "是"
    else:
       google_flag = "否"
    
    if form.getvalue('runoob'):
       runoob_flag = "是"
    else:
       runoob_flag = "否"
    
    print ("Content-type:text/html")
    print ()
    print ("<html>")
    print ("<head>")
    print ("<meta charset="utf-8">")
    print ("<title>菜鸟教程 CGI 测试实例</title>")
    print ("</head>")
    print ("<body>")
    print ("<h2> 菜鸟教程是否选择了 : %s</h2>" % runoob_flag)
    print ("<h2> Google 是否选择了 : %s</h2>" % google_flag)
    print ("</body>")
    print ("</html>")
    
  • ##### 通过cgi程序传递radio数据

    Radio 只向服务器传递2个数目,HTML代码如下:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    <form action="/cgi-bin/radiobutton.py" method="post" target="_blank">
    <input type="radio" name="site" value="runoob" /> 菜鸟教程
    <input type="radio" name="site" value="google" /> Google
    <input type="submit" value="提交" />
    </form>
    </body>
    </html>
    

    radiobutton.py 脚本代码如下:

    #!/usr/bin/python3
    
    # 引入 CGI 处理模块 
    import cgi, cgitb 
    
    # 创建 FieldStorage的实例 
    form = cgi.FieldStorage() 
    
    # 接收字段数据
    if form.getvalue('site'):
       site = form.getvalue('site')
    else:
       site = "提交数据为空"
    
    print ("Content-type:text/html")
    print ()
    print ("<html>")
    print ("<head>")
    print ("<meta charset="utf-8">")
    print ("<title>菜鸟教程 CGI 测试实例</title>")
    print ("</head>")
    print ("<body>")
    print ("<h2> 选中的网站是 %s</h2>" % site)
    print ("</body>")
    print ("</html>")
    

    修改 radiobutton.py 权限:

    chmod 755 radiobutton.py
    
  • 经过CGI程序传递textarea数据

    Textarea 向服务器传递多行数据,HTML代码如下:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    <form action="/cgi-bin/textarea.py" method="post" target="_blank">
    <textarea name="textcontent" cols="40" rows="4">
    在这里输入内容...
    </textarea>
    <input type="submit" value="提交" />
    </form>
    </body>
    </html>
    

    textarea.py 脚本代码如下:

    #!/usr/bin/python3
    
    # 引入 CGI 处理模块 
    import cgi, cgitb 
    
    # 创建 FieldStorage的实例 
    form = cgi.FieldStorage() 
    
    # 接收字段数据
    if form.getvalue('textcontent'):
       text_content = form.getvalue('textcontent')
    else:
       text_content = "没有内容"
    
    print ("Content-type:text/html")
    print ()
    print ("<html>")
    print ("<head>")
    print ("<meta charset="utf-8">")
    print ("<title>菜鸟教程 CGI 测试实例</title>")
    print ("</head>")
    print ("<body>")
    print ("<h2> 输入的内容是:%s</h2>" % text_content)
    print ("</body>")
    print ("</html>")
    

    修改 textarea.py 权限:

    chmod 755 textarea.py
    
  • ##### 通过CGI程序传递下拉数量

    HTML 下拉框代码如下:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    <form action="/cgi-bin/dropdown.py" method="post" target="_blank">
    <select name="dropdown">
    <option value="runoob" selected>菜鸟教程</option>
    <option value="google">Google</option>
    </select>
    <input type="submit" value="提交"/>
    </form>
    </body>
    </html>
    

    dropdown.py 脚本代码如下所示:

    #!/usr/bin/python3
    
    # 引入 CGI 处理模块 
    import cgi, cgitb 
    
    # 创建 FieldStorage的实例 
    form = cgi.FieldStorage() 
    
    # 接收字段数据
    if form.getvalue('dropdown'):
       dropdown_value = form.getvalue('dropdown')
    else:
       dropdown_value = "没有内容"
    
    print ("Content-type:text/html")
    print ()
    print ("<html>")
    print ("<head>")
    print ("<meta charset="utf-8">")
    print ("<title>菜鸟教程 CGI 测试实例</title>")
    print ("</head>")
    print ("<body>")
    print ("<h2> 选中的选项是:%s</h2>" % dropdown_value)
    print ("</body>")
    print ("</html>")
    

    修改 dropdown.py 权限:

    chmod 755 dropdown.py
    
  • #### CGI中使用cookie

    在 http 协议3个异常的大的败笔便是畸形用户地方的展开决断,那样给编制程序人士带来比一点都不小的困难, 而 cookie 功用的出现弥补了这一个不足。

    cookie 正是在客户走访脚本的同时,通过客户的浏览器,在客户硬盘上写入纪录数据 ,当下次客户走访脚本时取回数据音信,从而完毕身份鉴定区别的意义,cookie 常用在地点校验中。

    • ##### cookie的语法

      http cookie的出殡是经过http底部来贯彻的,他早于文件的传递,底部set-cookie的语法如下:

      Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
      
      • name=name: 要求设置cookie的值(name不能够选取";"和","号),有多个name值时用 ";" 分隔,例如:name1=name1;name2=name2;name3=name3
      • expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"
      • **path=path: **安装cookie支持的路径,要是path是三个门道,则cookie对那个目录下的装有文件及子目录生效,举例: path="/cgi-bin/",假如path是贰个文件,则cookie指对那么些文件生效,比方:path="/cgi-bin/cookie.cgi"。
      • domain=domain: 对cookie生效的域名,比如:domain="www.runoob.com"
      • secure: 如果给出此标识,表示cookie只好通过SSL协议的https服务器来传递。
      • cookie的收取是透过安装景况变量HTTP_老董KIE来落到实处的,CGI程序能够经过寻觅该变量获取cookie新闻。
    • ##### cookie设置

      Cookie的装置非常轻易,cookie会在http尾部单独发送。以下实例在cookie中设置了name 和 expires:

      #!/usr/bin/python3
      # 
      print ('Content-Type: text/html')
      print ('Set-Cookie: name="菜鸟教程";expires=Wed, 28 Aug 2016 18:30:00 GMT')
      print ()
      print ("""
      <html>
        <head>
          <meta charset="utf-8">
          <title>菜鸟教程(runoob.com)</title>
        </head>
          <body>
              <h1>Cookie set OK!</h1>
          </body>
      </html>
      """)
      

      将以上代码保存到 cookie_set.py,并修改 cookie_set.py 权限:

      chmod 755 cookie_set.py
      

      上述实例使用了 Set-Cookie 头音讯来安装库克ie新闻,可挑选中安装了Cookie的别的质量,如过期时间Expires,域名Domain,路线Path。这几个新闻设置在 "Content-type:text/html"此前。

    • ##### 检索cookie信息

      Cookie消息寻觅页非常轻松,Cookie音信囤积在CGI的碰着变量HTTP_CEOKIE中,存款和储蓄格式如下:

      key1=value1;key2=value2;key3=value3....
      

      以下是多少个简约的CGI检索cookie音讯的次序:

      #!/usr/bin/python3
      
      # 导入模块
      import os
      import http.cookies
      
      print ("Content-type: text/html")
      print ()
      
      print ("""
      <html>
      <head>
      <meta charset="utf-8">
      <title>菜鸟教程(runoob.com)</title>
      </head>
      <body>
      <h1>读取cookie信息</h1>
      """)
      
      if 'HTTP_COOKIE' in os.environ:
          cookie_string=os.environ.get('HTTP_COOKIE')
          c=Cookie.SimpleCookie()
          c.load(cookie_string)
      
          try:
              data=c['name'].value
              print ("cookie data: " data "<br>")
          except KeyError:
              print ("cookie 没有设置或者已过去<br>")
      print ("""
      </body>
      </html>
      """)
      

      将上述代码保存到 cookie_get.py,并修改 cookie_get.py 权限:

      chmod 755 cookie_get.py
      

      ##### 文件上传实例

      HTML设置上传文件的表单须求安装 enctype 属性为 multipart/form-data,代码如下所示:

      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title>菜鸟教程(runoob.com)</title>
      </head>
      <body>
       <form enctype="multipart/form-data" 
                           action="/cgi-bin/save_file.py" method="post">
         <p>选中文件: <input type="file" name="filename" /></p>
         <p><input type="submit" value="上传" /></p>
         </form>
      </body>
      </html>
      

      save_file.py脚本文件代码如下:

      #!/usr/bin/python3
      
      import cgi, os
      import cgitb; cgitb.enable()
      
      form = cgi.FieldStorage()
      
      # 获取文件名
      fileitem = form['filename']
      
      # 检测文件是否上传
      if fileitem.filename:
         # 设置文件路径 
         fn = os.path.basename(fileitem.filename)
         open('/tmp/'   fn, 'wb').write(fileitem.file.read())
      
         message = '文件 "'   fn   '" 上传成功'
      
      else:
         message = '文件没有上传'
      
      print ("""
      Content-Type: text/htmln
      <html>
      <head>
      <meta charset="utf-8">
      <title>菜鸟教程(runoob.com)</title>
      </head>
      <body>
         <p>%s</p>
      </body>
      </html>
      """ % (message,))
      

      将以上代码保存到 save_file.py,并修改 save_file.py 权限:

      chmod 755 save_file.py
      

      借使您使用的系统是Unix/Linux,你必须替换文件分隔符,在window下只须求选择open()语句就能够:

      fn = os.path.basename(fileitem.filename.replace("\", "/" ))
      
  • ##### 文件下载对话框

    我们先在当前目录下创办 foo.txt 文件,用于程序的下载。

    文本下载通过设置HTTP头音信来落实,功用代码如下:

    #!/usr/bin/python3
    
    # HTTP 头部
    print ("Content-Disposition: attachment; filename="foo.txt"")
    print ()
    # 打开文件
    fo = open("foo.txt", "rb")
    
    str = fo.read();
    print (str)
    
    # 关闭文件
    fo.close()
    

  完毕报到以往,就可以跻身后台管理连串的主分界面,因为这些是小品种,所以导航菜单全体定点在HTML中,不能够修改。一般后台还会有多个应接页或根本数据显示的主页面,小品种也尚无多大的须求,所以登入后一直进去公司介绍编辑页面。

 

  首先大家来看一下供销合作社介绍页面内容

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>luyaran(luyaran.com)</title>
</head>
<body>
 <form enctype="multipart/form-data" 
                     action="/cgi-bin/save_file.py" method="post">
   <p>选中文件: <input type="file" name="filename" /></p>
   <p><input type="submit" value="上传" /></p>
   </form>
</body>
</html>

  图片 1

    save_file.py脚本文件代码如下:

  看上去成效看似一点也不细略,其实我们要拍卖的事物照旧挺多的。

 

  从页面上看,大家须要有八个笔录读取的接口,来拿到公司介绍的源委,并出示在页面上。当然现在数据Curry面未有记录存在,所以大家还索要向数据库的音讯表(infomation)中插入一条公司介绍的笔录,那样好直接举办编辑(因为公司介绍不会有很多条记下,一般定了后就不会再转移,所以只供给在数据库的音讯表里插入一条就足以了)

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import cgi, os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()

# 获取文件名
fileitem = form['filename']

# 检测文件是否上传
if fileitem.filename:
   # 设置文件路径 
   fn = os.path.basename(fileitem.filename)
   open('/tmp/'   fn, 'wb').write(fileitem.file.read())

   message = '文件 "'   fn   '" 上传成功'

else:
   message = '文件没有上传'

print """
Content-Type: text/htmln
<html>
<head>
<meta charset="utf-8">
<title>luyaran(luyaran.com)</title>
</head>
<body>
   <p>%s</p>
</body>
</html>
""" % (message,)

  别的,从分界面上看,我们还供给有1个上传文件的接口,能够上传图片和文件;还索要一个翻新集团介绍内容的接口。

    将以上代码保存到 save_file.py,并修改 save_file.py 权限,之后运营就能够看来效果了,我们那边就不赘述了。纵然您利用的种类是Unix/Linux,你必须替换文件分隔符,在window下只须求运用open()语句就能够。

  还有必要修改多少个地点,有上传文件,肯定需求有下载的接口,所以须要增添八个下载的路由(python与此外语言不均等的地点是,全数访问都必须透过路由,所以上传的或坐落目录中的文件要求联合定义3个接口来拍卖,不然用户访问不了,即使有些辛勤,但诸如此类管理也安然大多,用户上传任何带有木马或程序的文书,它也无力回天在服务器端实行);nginx配置文件也急需修改一下,增添下载路线规则,那样就足以平素通过nginx访问下载路线了。

 

 

fn = os.path.basename(fileitem.filename.replace("\", "/" ))

  向数据库中增加集团介绍记录

    接下去就来看下载。大家先在当前目录下创办 foo.txt 文件,用于程序的下载。文件下载通过安装HTTP头新闻来贯彻,成效代码如下:

  运维pgAdmin连上数据库,然后按第伍章的做法,张开sql查询深入分析器,运维上面代码增加一条数据库记录

 

INSERT INTO infomation(id, title)  VALUES (1, '公司介绍');
#!/usr/bin/python
# -*- coding: UTF-8 -*-

# HTTP 头部
print "Content-Disposition: attachment; filename="foo.txt"";
print
# 打开文件
fo = open("foo.txt", "rb")

str = fo.read();
print str

# 关闭文件
fo.close()

 

    好啊,此番分享相比少,我们将就那看看哈。。。

  增添公司介绍记录读取接口

    如若认为不错的话,请多多点赞协理啊。。。

 1 @get('/api/about/')
 2 def callback():
 3     """
 4     获取指定记录
 5     """
 6     sql = """select * from infomation where id = 1"""
 7     # 读取记录
 8     result = db_helper.read(sql)
 9     if result:
10         # 直接输出json
11         return web_helper.return_msg(0, '成功', result[0])
12     else:
13         return web_helper.return_msg(-1, "查询失败")

  原来的小说链接:

  因为商家介绍id增添后不会再变动,所以sql语句直接绑死id为一,此外,试行数据库查询今后,再次回到的是列表,所以回来记录时要拉长序号:result[0]

  运行debug(对main.py点击右键=》debug),将用户登入决断那两行注释掉(不然直接待上访问会再次回到-404,“您的登入已失效,请重新登六”提醒),在浏览器输入:

{"msg": "成功", "data": {"content": "", "front_cover_img": "", "id": 1, "title": "公司介绍", "add_time": "2017-10-31 14:17:45"}, "state": 0}

 

  增多公司介绍内容改换接口

 1 @put('/api/about/')
 2 def callback():
 3     """
 4     修改记录
 5     """
 6     front_cover_img = web_helper.get_form('front_cover_img', '图片')
 7     content = web_helper.get_form('content', '内容', is_check_special_char=False)
 8     # 防sql注入攻击处理
 9     content = string_helper.filter_str(content, "'")
10     # 防xss攻击处理
11     content = string_helper.clear_xss(content)
12 
13     # 更新记录
14     sql = """update infomation set front_cover_img=%s, content=%s where id=1"""
15     vars = (front_cover_img, content,)
16     # 写入数据库
17     db_helper.write(sql, vars)
18 
19     # 直接输出json
20     return web_helper.return_msg(0, '成功')

  因为厂家介绍只需要一条记下就够了,前边使用手动格局向数据库增加记录,所以代码中我们就无需写加多的主意

  修改记录使用put格局接收:@put('/api/about/')

  从分界面图片中得以见见,有成文标题、首页图片和文章内容,因为标题无需展开改变,所以大家修改接口只供给管理剩下两项就能够了。

  因为提交的剧情涵盖HTML代码,所以使用web_helper.get_form提取值时,供给动用is_check_special_char参数,设置为不反省特殊符号,不然会收下不了。别的接收到参数值今后,大家须求对它举行防sql注入和防xss处理。

  clear_xss()函数是string_helper包新扩充的破除xss攻击标签用的,它会过滤掉xss的口诛笔伐代码。详细代码如下:

def clear_xss(html):
    """
    清除xss攻击标签
    :param html: 要处理的html
    :return:
    """
    tags = ['a', 'abbr', 'acronym', 'b', 'blockquote', 'code', 'em', 'i', 'li', 'ol', 'strong', 'ul']
    tags.extend(
        ['div', 'p', 'hr', 'br', 'pre', 'code', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'del', 'dl', 'img', 'sub', 'sup', 'u',
         'table', 'thead', 'tr', 'th', 'td', 'tbody', 'dd', 'caption', 'blockquote', 'section'])
    attributes = {'*': ['class', 'id'], 'a': ['href', 'title', 'target'], 'img': ['src', 'style', 'width', 'height']}
    return bleach.linkify(bleach.clean(html, tags=tags, attributes=attributes))

  clear_xss()函数中我们使用了bleach那些库(要求设置:pip install bleach),它是三个依据白名单、通过转义或删除标签和总体性的主意,来对HTML文本清新的python库。

  我们在string_helper_test.py这些测试单元中增多2个测试用例,来测试一下以此函数的采用作用

    def test_clear_xss(self):
        print('-----test_clear_xss------')
        print(string_helper.clear_xss('<script src="javascript:alert(1);">abc</script>'))
        print(string_helper.clear_xss('<iframe src="javascript:alert(1);">abc</iframe>'))
        print(string_helper.clear_xss('<div style="width:0;height:0;background:url(javascript:document.body.onload = function(){alert(/XSS/);};">div</div>'))
        print(string_helper.clear_xss('<img src = "#"/**/onerror = alert(/XSS/)>'))
        print(string_helper.clear_xss('<img src = j ava script:al er t(/XSS/)>'))
        print(string_helper.clear_xss("""<img src = j
ava script :a ler t(/xss/)>"""))
        print(string_helper.clear_xss('<img src="javacript:alert('abc')"></img>'))
        print(string_helper.clear_xss('<img src="http://www.qjdongsheng.com/uploads/allimg/190513/124542F08-1.gif"></img>'))
        print(string_helper.clear_xss('<p src="javascript:alert(1);">abc</p>'))
        print(string_helper.clear_xss("""<input type="text" value="琅琊榜" onclick="javascript:alert('handsome boy')">"""))
        print(string_helper.clear_xss('<p onclick="javascript:alert("handsome boy")>abc</p>'))
        print(string_helper.clear_xss('<a href="javascript:alert(1);">abc</a>'))
        print(string_helper.clear_xss('<a href="/api/">abc</a>'))
        print(string_helper.clear_xss('<a href="http://www.baidu.com">abc</a>'))
        print(string_helper.clear_xss('<marquee onstart="alert(/XSS/)">文字</marquee>'))
        print(string_helper.clear_xss('<div style="" onmouseenter="alert(/XSS/)">文字</div>'))
        print(string_helper.clear_xss('<li style = "TEST:e-xpression(alert(/XSS/))"></li>'))
        print(string_helper.clear_xss('<input id = 1 type = "text" value="" <script>alert(/XSS/)</script>"/>'))
        print(string_helper.clear_xss('<base href="http://www.labsecurity.org"/>'))
        print(string_helper.clear_xss('<div id="x">alert(document.cookie);</div>'))
        print(string_helper.clear_xss('<limited_xss_point>eval(unescape(x.innerHTML));</limited_xss_point>'))

  施行后输出结果:

------ini------
-----test_clear_xss------
&lt;script src="javascript:alert(1);"&gt;abc&lt;/script&gt;
&lt;iframe src="javascript:alert(1);"&gt;abc&lt;/iframe&gt;
<div>div</div>
<img src="#">
<img src="j">
<img src="j">
<img>
<img src="http://www.qjdongsheng.com/uploads/allimg/190513/124542F08-1.gif">
<p>abc</p>
&lt;input onclick="javascript:alert('handsome boy')" type="text" value="琅琊榜"&gt;
<p>abc</p>
<a>abc</a>
<a href="/api/" rel="nofollow">abc</a>
<a href="http://www.baidu.com" rel="nofollow">abc</a>
&lt;marquee onstart="alert(/XSS/)"&gt;文字&lt;/marquee&gt;
<div>文字</div>
<li></li>
&lt;input &lt;script="" id="1" type="text" value=""&gt;alert(/XSS/)"/&gt;
&lt;base href="<a href="http://www.labsecurity.org" rel="nofollow">http://www.labsecurity.org</a>"&gt;
<div id="x">alert(document.cookie);</div>
&lt;limited_xss_point&gt;eval(unescape(x.innerHTML));&lt;/limited_xss_point&gt;
------clear------

  能够见见,对于富文本编辑器提交的代码,bleach基本满意了笔者们的堤防xss攻击的拍卖需要

 

  增多上传接口(PS:大家应用的公文编辑器是百度的ueditor,因为它并未有python的上传管理代码,所以大家须要起初工编织辑上传接口,以及html上也要实行对应的修改)

#!/usr/bin/evn python
# coding=utf-8

import os
from bottle import post, request
from common import datetime_helper, random_helper, log_helper

@post('/api/files/')
def callback():
    """
    修改记录
    """
    # 初始化输出值
    result = {
        "state": "FAIL",
        "url": "",
        "title": "上传失败",
        "original": ""
    }
    # 获取上传文件
    try:
        # upfile为前端HTML上传控件名称
        upload = request.files.get('upfile')
        # 如果没有读取到上传文件或上传文件的方式不正确,则返回上传失败状态
        if not upload:
            return result

        # 取出文件的名字和后缀
        name, ext = os.path.splitext(upload.filename)
        # 给上传的文件重命名,默认上传的是图片
        if ext and ext != '':
            file_name = datetime_helper.to_number()   random_helper.get_string(5)   ext
        else:
            file_name = datetime_helper.to_number()   random_helper.get_string(5)   '.jpg'
        upload.filename = file_name

        # 设置文件存储的相对路径
        filepath = '/upload/'   datetime_helper.to_number('%Y%m%d')   '/'
        # 组合成服务器端存储绝对路径
        upload_path = os.getcwd()   filepath
        # 如果目录不存在,则创建目录
        if not os.path.exists(upload_path):
            os.mkdir(upload_path)
        # 保存文件
        upload.save(upload_path   upload.filename, overwrite=True)

        # 设置输出参数(返回相对路径给客户端)
        result['title'] = result['original'] = upload.filename
        result['url'] = filepath   upload.filename
        result['state'] = 'SUCCESS'
    except Exception as e:
        log_helper.error('上传失败:'   str(e.args))

    # 直接输出json
    return result

  PS:这里只做了上传文件管理,没有上传成功现在存款和储蓄到数据库中联合管理,假设前端反复上传,会促成服务器存储多数剩余文件的主题素材,我们能够本人发挥想象与入手手艺,看看怎么化解那些难题。对于那些主题材料会在其次部分联合处理。

 

  增添上传文书存款和储蓄文件夹:直接在品种的要目录下开创upload文件夹

  图片 2

 

  修改main.py文件配置,并创办理文件件下载路由

  导入的bottle库添加response, static_file那多少个包,response用于安装输出文件类型为2进制数据传输格式,那样设置后,上传的各系列型文件都足以下载;static_file是利用安全的措施读取文件并出口到客户端

from bottle import default_app, get, run, request, hook, route, response, static_file

  在第二陆行插入上边代码,初叶化上传文件存款和储蓄路线

# 定义upload为上传文件存储路径
upload_path = os.path.join(program_path, 'upload')

  增添下载文件访问路由,设置后借使放在upload目录下的文书都能够直接通过浏览器下载

@get('/upload/<filepath:path>')
def upload_static(filepath):
    """设置静态内容路由"""
    response.add_header('Content-Type', 'application/octet-stream')
    return static_file(filepath, root=upload_path)

 

  做完以上设置,上传与革新就不曾难点了,上传的图片直接选择

  展开nginx配置文件 :E:Servicenginx-1.11.5confnginx.conf

  将location ~* ^/(index|api)/ 修改为 location ~* ^/(index|api|upload)/ 

  然后在windows职务管理器(键盘同时按Ctrl Alt Del键,点击运行义务管理器),找到nginx_service.exe,右键=》停止进度树

  重新展开服务(调整面板=》全数调节面板项=》管理工科具=》服务),运转nginx_service服务

 

  前端页面相关修改

  向/lib/ueditor/壹.四.3/目录中增加python文件夹,将增添config.json那些布局项

  修改/lib/ueditor/一.肆.3/ueditor.config.js 配备项中 服务器统一请求接口路径 为 /api/files/

  本文对应的源码包里有ueditor编辑器最新代码(刚刚去百度下载的),去掉了剩下的文件,大家可一向删除lib目录里的ueditor那些文件夹,使用源码包里的交替上去就可以了

  前端页面包车型客车javascript脚本加多了ueditor编辑器初阶化、文件上传和表单提交等效果,可一贯交换about_edit.html文件,具体大家自个儿钻探一下。

  最终效果:

  图片 3

    图片 4

 

  别的,联系大家的功能与店四介绍大约,在此地留一下学业给大家自身尝试做3个牵连咱们编辑页面出来,下一篇会给联络大家编辑页面源码给大家

 

  本文对应的源码下载

 

作者:AllEmpty
出处:
有意思味的意中人能够加加python开辟QQ群:66905847伍,我们一齐探究。我们不日常的话能够在群里发问,当然小编经常工作也充裕艰难不必然会及时回复。

本文为AllEmpty原创,招待转发,但未经允许必须保留此段表明,且在篇章页面分明地方给出原来的作品连接,否则保留追究法律权利的职分。

本文由必发88手机版发布,转载请注明来源:百货店介绍编辑作用,文件下载