📜  Python | 使用Flask进行Web开发简介

📅  最后修改于: 2020-05-06 05:02:39             🧑  作者: Mango

什么是Flask?
Flask是Python的API,可用于构建Web应用程序。它是由Armin Ronacher开发的。Flask的框架比Django的框架更明确,并且更易于学习,因为它具有更少的基本代码来实现简单的Web应用程序。Web应用程序框架或Web框架是模块和库的集合,可帮助开发人员编写应用程序而无需编写协议,线程管理等底层代码。Flask基于WSGI(Web服务器网关接口)工具箱和Jinja2模板引擎。

Flask入门:
安装Flask需要Python 2.6或更高版本。您可以从任何Python IDE上的flask包中导入Flask开始。
要测试安装是否正常,请查看以下给出的代码

# WSGI应用程序的对象
from flask import Flask
app = Flask(__name__)   # Flask constructor
# 装饰器,用于告知应用程序哪个URL与函数相关
@app.route('/')
def hello():
    return 'HELLO'
if __name__=='__main__':
   app.run()

“ /” URL与hello()函数绑定。在浏览器中打开Web服务器的主页时,将相应地呈现此函数的输出。
通过调用run()函数来启动Flask应用程序。对于代码中的任何更改,应手动重新启动该方法。为了克服这个问题,启用了调试支持以便跟踪任何错误。

app.debug = True
app.run()
app.run(debug = True)

路由:
如今,Web框架提供了路由技术,以便用户可以记住URL。直接访问网页而无需从主页导航,这非常有用。这是通过以下route()装饰器将URL绑定到函数来完成的。

# 装饰器以路由URL
@app.route(‘/hello’)
# 绑定到路由函数
def hello_world():
   return ‘hello world’

如果用户访问http://localhost:5000/hello URL,则hello_world()函数的输出将在浏览器中呈现。add_url_rule()如上例所示,应用程序对象的函数还可用于将URL与该函数绑定。

def hello_world():
   return ‘hello world’
app.add_url_rule(‘/’, ‘hello’, hello_world)

在Flask中使用变量:
Flask中的变量用于通过将变量部分添加到Rule参数来动态构建URL。此可变部分作为关键字参数传递。参见下面的例子

from flask import Flask
app = Flask(__name__)
# 路由装饰器函数hello_name
@app.route('/hello/')
def hello_name(name):
   return 'Hello %s!' % name
if __name__ == '__main__':
   app.run(debug = True)

将上面的示例另存为hello.py并从Power Shell运行。接下来,打开浏览器并输入URL http://localhost:5000/hello/mangodoc
输出:

Hello mangodoc!

在上面的示例中,route()装饰器的参数包含作为参数附加到URL’/ hello’的可变部分。因此,如果输入了诸如 http://localhost:5000/hello/mangodoc 之类的URL,则“ mangodoc”将作为参数传递给hello()函数。

除了默认的字符串变量部分外,还使用其他数据类型,例如int,float和path(用于目录分隔符通道,可以使用斜线)。Flask的URL规则基于Werkzeug的路由模块。这样可以确保形成的URL是唯一的,并且基于Apache规定的先例。例子:

from flask import Flask
app = Flask(__name__)
@app.route('/blog/')
def show_blog(postID):
   return 'Blog Number %d' % postID
@app.route('/rev/')
def revision(revNo):
   return 'Revision Number %f' % revNo
if __name__ == '__main__':
   app.run()
# say the URL is http://localhost:5000/blog/555

输出:

Blog Number 555
# Enter this URL in the browser ? http://localhost:5000/rev/1.1
Revision Number: 1.100000

在FLask中构建URL:
使用url_for()函数可以动态构建特定函数的URL 。该函数接受函数名称作为第一个参数,以及一个或多个关键字参数。看这个例子

from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/admin')  # 路由(参数)函数的装饰器
def hello_admin():     # 绑定到hello_admin
   return 'Hello Admin'
@app.route('/guest/')
def hello_guest(guest):    # 绑定到hello_guest
   return 'Hello %s as Guest' % guest
@app.route('/user/')
def hello_user(name):
   if name =='admin':  # URL与函数的动态绑定
      return redirect(url_for('hello_admin'))
   else:
      return redirect(url_for('hello_guest', guest = name))
if __name__ == '__main__':
   app.run(debug = True)

要进行测试,请保存上面的代码并通过Python shell运行,然后打开浏览器并输入以下URL:

Input: http://localhost:5000/user/admin
Output: Hello Admin
Input: http://localhost:5000/user/ABC
Output: Hello ABC as Guest

上面的代码具有一个名为user(name)的函数,可通过输入URL接受值。它基本上检查接收到的参数是否与“ admin”参数匹配。如果匹配,则调用hello_admin()函数,否则调用hello_guest()。
Flask支持各种HTTP协议,用于从指定的URL检索数据,这些协议可以定义为:

方法 描述
GET 这用于以不加密形式将数据发送到服务器。
HEAD 提供表单的回应主体
POST 将表单数据发送到服务器。服务器未缓存通过POST方法接收的数据。
PUT 用URL替换目标资源的当前表示形式。
DELETE 删除给定URL的目标资源

处理静态文件:
Web应用程序通常需要静态文件(例如Javascript或CSS文件)才能在浏览器中呈现网页的显示。通常,将Web服务器配置为设置它们,但是在开发过程中,这些文件在您的包中或模块旁边用作静态文件夹。请参见下面的JavaScript示例:

from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def index():
   return render_template("index.html")
if __name__ == '__main__':
   app.run(debug = True)

以下HTML代码:


   
      
   
   
      
   

的JavaScript文件hello.js是:

function sayHello() {
   alert("Hello World")
}

上面的hello.js文件将相应地呈现为HTML文件。
来自客户端网页的数据对象请求将作为全局请求对象发送到服务器。然后通过导入Flask模块对其进行处理。这些属性包括表单(包含键值对),Args(问号后的解析URL(?)),Cookies(包含Cookie名称和值),Files(与上传文件有关的数据)和Method(当前请求)之类的属性。

Cookies:
Cookie是存储在客户计算机上的一种文本文件形式,其目的是记住并跟踪与客户使用有关的数据,以便根据用户的经验和网页统计信息来改善网站。
Request对象包含cookie的属性。它是所有cookie变量及其对应值的字典对象。它还包含自身的到期时间。在Flask中,cookie是在响应对象上设置的。请参见下面的示例:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
   return render_template('index.html')

   
      

Enter userID

bright_5
@app.route('/setcookie', methods = ['POST', 'GET'])
def setcookie():
   if request.method == 'POST':
      user = request.form['nm']
   resp = make_response(render_template('cookie.html'))
   resp.set_cookie('userID', user)
   return resp
@app.route('/getcookie')
def getcookie():
   name = request.cookies.get('userID')
   return '

welcome '+name+'

'

运行上面的应用程序,并访问浏览器 http://localhost:5000/。该表单设置为’/ setcookie’,函数集包含一个将被呈现到另一个网页的Cookie名称userID。“ cookie.html”包含指向另一个视图函数getcookie()的超链接,该函数在浏览器中显示该值。

Flask中的会话Sessions:
在会话中,数据存储在服务器上。可以将其定义为客户端登录服务器直到用户注销之前的时间间隔。它们之间的数据保存在服务器上的临时文件夹中。每个用户都分配有一个特定的会话ID。Session对象是一个字典,其中包含与session关联的变量的键/值对。SECRET_KEY用于将加密的数据存储在cookie上。
例如:

Session[key] = value   // 存储会话值
Session.pop(key, None)  // 释放会话变量

其他重要的Flask函数::
redirect()用于返回对象的响应,并使用指定的状态代码将用户重定向到另一个目标位置。

语法:
Flask.redirect(location, statuscode, response)

// location用于重定向到所需的URL
// statuscode发送标头值,默认值302 /
response用于发起响应。
abort:用于处理代码中的错误。

语法:

Flask.abort(code)

code参数可以采用以下值来相应地处理错误:

  • 400 –错误请求
  • 401 –未认证
  • 403 –禁止请求
  • 404 –未找到
  • 406 –不接受
  • 425 –对于不受支持的媒体
  • 429 –请求过多

Flask中的文件上传

Flask中的文件上传非常容易。它需要一个带有enctype属性和URL处理程序的HTML表单,该表单可以获取文件并将对象保存到所需的位置。文件被临时存储在服务器上,然后存储在所需的位置。
处理上传URL的HTML语法为:

form action="http://localhost:5000/uploader" method="POST" enctype="multipart/form-data"

以下Flask的Python代码是:

from flask import Flask, render_template, request
from werkzeug import secure_filename
app = Flask(__name__)
@app.route('/upload')
def upload_file():
   return render_template('upload.html')
@app.route('/uploader', methods = ['GET', 'POST'])
def upload_file():
   if request.method == 'POST':
      f = request.files['file']
      f.save(secure_filename(f.filename))
      return 'file uploaded successfully'
if __name__ == '__main__':
   app.run(debug = True)

将表单数据发送到服务器的HTML文件:
HTML中的表单用于收集所需条目的信息,然后将这些条目转发并存储在服务器上。可以要求他们阅读或修改表格。Flask通过使用URL规则提供此函数。在下面的示例中,“ /” URL呈现了具有表单的网页(student.html)。填充的数据将发布到“ /结果” URL,该URL会触发result()函数。results()函数收集字典对象中request.form中存在的表单数据,并将其发送以呈现给result.html。

from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def student():
   return render_template('student.html')
@app.route('/result', methods = ['POST', 'GET'])
def result():
   if request.method == 'POST':
      result = request.form
      return render_template("result.html", result = result)
if __name__ == '__main__':
   app.run(debug = True)


   
      
         {% for key, value in result.items() %}
            
         {% endfor %}
      
{{ key }} {{ value }}

   
      

Name

Physics

Chemistry

Maths


消息闪烁:
可以将其定义为出现在网页上的弹出窗口或对话框,或者类似JavaScript中的警报,用于通知用户。可以通过使用Flask中的flash()方法在Flask中完成此操作。它将消息传递到下一个模板。

语法:

flash(message, category)

message是要显示的实际文本,category是可选的,它将显示任何错误或信息。
范例:

from flask import Flask
app = Flask(__name__)
# /login 显示登录表单
@app.route('/login', methods = ['GET', 'POST'])
# login function verify username and password
def login():
   error = None
   if request.method == 'POST':
      if request.form['username'] != 'admin' or \
         request.form['password'] != 'admin':
         error = 'Invalid username or password. Please try again !'
      else:
         # 登录成功时闪烁
         flash('You were successfully logged in')
         return redirect(url_for('index'))
   return render_template('login.html', error = error)