当前位置:   article > 正文

Python Flask 模块

python flask

一、初识Flask

Flask扩展应用扩展包

二、认识werkzurg,Flask最重要的依赖

Python Web 框架工具包 werkzeug

 # 引用werkzurg的功能模块
from werkzeug.wrappers import Request,Response
from werkzeug.serving import run_simple
 # 底层的用法
def run(environ,start_response):
 return [b'abcdefg'] 
if __name__ == '__main__':
 run_simple('localhost',4000,run) # 监听端口并执行run函数	
 # 另一种用法
@Response.application
def hello(request):
 return Response('Hello World!')
 '''
 	return到底返回到客户端什么内容?
 	1、状态码:status code 200,301,404,返回一个响应的客户端的状态码;
 	2、content-type:告诉客户端用什么方式解析返回的值;
 	3、其他的返回头信息。
 '''
if __name__ == __main__:
 run_simple('localhost',4000,hello)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

三、Flask 使用

3.1、简单的登录

from flask import Flask as fk , request,render_template as render,redirect,session,make_response
app = fk(__name__)
app.secret_key = 'abckd' # 设置session 的加密值
@app.route('/',methods=['GET','POST'])
def index():
 if request.method == 'POST':
  user = request.form.get('user')
  pwd = request.form['pwd']
  if user == 'admin' and pwd == '123':
   print(user,pwd)
   return '登录成功!'
 return render('index.html',h1='你好')
 # home.add_url_rule('/',view_func=index) #第二种路由的声明方式,必须已“/”开头
if __name__ == '__main__':
 app.run(debug=True,host='192.168.0.11',port=5000) 
'''
执行werkzurg中的run_simple('localhost',4000,hello)
这里只是socket进行了请求监听,当浏览器发起请求后
执行内部的__call__()方法
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
静态文件的处理方法
<!-- 使用静态文件需要删除 <!DOCTYPE html> -->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/index.css" type="text/css">
    <!-- javascript引用时必须添加type="text/javascript" -->
   <script language="javaacript" src="/statics/jquery.min.js" type="text/javascript"></script> 
    <!-- 推荐使用这样加载静态文件 -->
    <link rel="stylesheet" href="{
    { url_for('static',filename='index.css') }}" type="text/css"> 
    <!-- url_for(),函数配置静态文件,一定要在Flask类中设置静态文件的路径和别名,蓝图中设置静态文件路径和别名是不能使用的 -->
</head>
<body>
<h1>index</h1>
<h1>{
  { h1 }}</h1>
<form action="/" method="POST">
    <input type="text" name="user" >
    <input type="password" name="pwd">
    <input type="submit" value="提交">
</form>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

使用 url_for 函数获取静态资源时,必须在实例化 Flask 对象的时候设置 static_url_path(别名),static_folder(静态文件路径)

from flask import Flask
from .views.index import home
def shb():
    app = Flask(__name__,static_url_path='/static',static_folder='./public',template_folder='./template')
    '''
    PS:
    	1、static_folder的路径一定要设置正确。
    	2、static_url_path的值必须是’/static‘,其他测试无效。
    	3、url(’static‘,filename='静态文件路径') 第一个值必须是’static‘,其他测试无效。
    	4、template_folder 配置注意存放路径。
    	5、蓝图中就不再配置存放静态文件的路径和引用别名了;模板也不用再配置,这里是全局配置。
    '''
    app.register_blueprint(home,url_prefix="/api")
    return app
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

3.2、Flask 简单运用

 from flask import Flask,render_template,request,redirect,session
 app = Flask(__name__) # __name__ 可以修改为任意字符串,并可以传入多个参数
 app.secret_key = 'abckd' # 设置session加密多余字符串
 # 路由装饰器,必须已“/”开头
 @app.route('/login',methods=['GET','POST'])
 # 定义与路由装饰器匹配的执行函数
 def login():
	 print(request.method) # request 需要导入,获取请求的信息
	 session['key] = value # 设置session值
	 session.get('key') # 获取session的值
	 return render_template('login.html',**{
   key:value})
	#return render_template('login.html',key=value)
 if __name__ == '__main__':
  app.run(url,prot)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3.4、Flask 的实现基础

Python Threading 线程模块用法

3.4.1、Threading.local 多线程

作用:为每个线程创建一个独立的空间,使得线程对自己空间中的数据进行操作(数据隔离)。

 import threading
 from threading import local
 local_obj = local() # 实例化local对象
 def task(i):
  local_obj.xxx = i # 为local对象设置一个参数
  print(local_obj.xxx,i) # 获取local对象中的参数
  # threading.get_ident() 获取线程的唯一标示
  print(threading.get_ident(),i)
 for i in range(10):
  t = threading.Thread(target=task,args(i,)) # 创建线程
  t.start() # 开始执行线程
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
3.4.2、根据字典自定义类似Threading.localz
 import threading
 import greenlet # 获取协程信息
 DIC = {
   }
 def task(i):
  # 获取协成的唯一标记
  # indent = greenlet.getcurrent()
  # treading.get_ident() 获取线程的唯一标记
  indent = treading.get_ident()
  if indent in DIC:
   DIC[indent]['xxx'] = i
  else:
   DIC[indent] = {
   'xxx':i}
  print(DIC[index][xxx],i) # 打印字典中的参数
 for i in range(10):
  t = threading.Thread(target=task,args=(i,)) # 创建线程
  t.start() # 开始执行线程
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
3.4.3、自定义升级版Threading.localz
此版本中协程与线程可以完全的兼容,完成对请求的数据隔离。
为什么需要给线程和协程数据进行隔离?
 在多个请求的时候,由于每个请求的信息不相同,所以需要对不同的请求信息进行分类管理(数据隔离),从而防止数据混乱;
 这样在需要使用视图函数取得用户请求信息的时候,才能根据不同的信息进行取值和修改。
  • 1
  • 2
  • 3
  • 4
 import threading
 import time
 
 try:
  import greenlet # 获取协程信息
  get_indent = greenlet
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/483368
推荐阅读
相关标签
  

闽ICP备14008679号