python之flask安装以及使用

news2024/11/28 6:50:21

1 flask介绍

Flask是一个非常小的Python Web框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。

2 python虚拟环境搭建

python虚拟环境管理方法:
​
1.virtualenv
2.Virtualenvwrapper
3.conda
4.pipenv

3 pipenv使用

┌──(kali㉿kali)-[~/Desktop/python_code]
└─$ ls       
flask1    
┌──(kali㉿kali)-[~/Desktop/python_code]
└─$ cd flask1                                         
┌──(kali㉿kali)-[~/Desktop/python_code/flask1]
└─$ pipenv shell    

┌──(flask1-l5Pm-i-x)─(kali㉿kali)-[~/Desktop/python_code/flask1]
└─$ ls
Pipfile
#Pipfile 等于安装的插件包名
┌──(flask1-l5Pm-i-x)─(kali㉿kali)-[~/Desktop/python_code/flask1]
└─$ cat Pipfile 
安装 flask
┌──(flask1-l5Pm-i-x)─(kali㉿kali)-[~/Desktop/python_code/flask1]
└─$ pipenv install flask
​

4 flask第一个应用

新建app.py

#!/usr/bin/env python3
​
from flask import Flask
​
#初始化
app =Flask(__name__)
​
@app.route('/')
def index():
    return  'Hello World!'
​
if __name__ == '__main__':
    app.run()

执行app.py

游览器效果

5 路由和视图函数

#!/usr/bin/env python3  
# 这一行告诉系统使用哪个解释器来执行脚本,这里指定为 python3  
  
from flask import Flask  
# 从flask模块中导入Flask类,用于创建Flask web应用程序实例  
  
# 初始化  
app = Flask(__name__)  
# 创建一个Flask应用程序实例,并赋值给变量app。__name__是当前模块的名字,代表应用程序的根路径  
  
# 设置多个路由  
@app.route('/')  
# 定义一个路由装饰器,当访问根路径'/'时,会调用下面的index函数  
def index():  
    return 'Hello World!'  
# 定义一个视图函数index,当访问'/'路径时,返回'Hello World!'字符串  
  
@app.route('/a')  
# 定义另一个路由装饰器,当访问'/a'路径时,会调用下面的add函数  
def add():  
    return '1+1=2'  
# 定义一个视图函数add,当访问'/a'路径时,返回'1+1=2'字符串  
  
@app.route('/user/<username>')  
# 定义一个带有动态部分的路由装饰器,'<username>'是一个动态部分,可以匹配任何字符串  
def user_index(username):  
    # 在函数中指明变量名称username,就能获取到通过路由传入的变量username  
    return 'Hello {} '.format(username)  
# 定义一个视图函数user_index,该函数接受一个参数username,这是从路由动态部分获取的。函数返回'Hello '加上用户名  
  
@app.route('/post/<int:post_id>')  
# 定义一个带有动态部分且类型指定的路由装饰器,'<int:post_id>'表示动态部分必须是整数类型  
def show_post(post_id):  
    return 'Post {} '.format(post_id)  
# 定义一个视图函数show_post,该函数接受一个整数类型的参数post_id,这是从路由动态部分获取的。函数返回'Post '加上文章ID  
  
if __name__ == '__main__':  
    # 判断当前脚本是否作为主程序运行  
    app.run(debug=True)  
​

6URL重定向

#!/usr/bin/env python3  
  
# 导入 Flask 框架  
from flask import Flask  
from flask import url_for  
from flask import redirect  
  
# 初始化 Flask 应用  
app = Flask(__name__)  
  
# 设置路由到根路径 '/'  
@app.route('/')  
def index():  
    return 'Hello World!'  # 返回欢迎信息  
  
# 设置路由到 '/a'  
@app.route('/a')  
def add():  
    return '1+1=2'  # 返回加法运算结果  
  
# 设置路由到 '/user/<username>',其中 <username> 是一个动态部分  
@app.route('/user/<username>')  
def user_index(username):  
    # 在视图函数中通过参数获取路由中的动态部分 username  
    return 'Hello {} '.format(username)  # 返回包含用户名的欢迎信息  
  
# 设置路由到 '/post/<int:post_id>',其中 <int:post_id> 是一个整数类型的动态部分  
@app.route('/post/<int:post_id>')  
def show_post(post_id):  
    return 'Post {} '.format(post_id)  # 返回包含帖子ID的字符串  
  
# 设置路由到 '/test'  
@app.route('/test')  
def test():  
    # 使用 url_for 函数生成路由的 URL,并打印出来  
    print(url_for('index'))  # 打印根路径的 URL  
    print(url_for('user_index', username='scj'))  # 打印用户路径的 URL,传入用户名 'scj'  
    print(url_for('show_post', post_id=1))  # 打印帖子路径的 URL,传入帖子ID 1  
    return 'test'  # 返回测试字符串  
  
# 设置路由到 '/<username>',其中 <username> 是一个动态部分  
@app.route('/<username>')  
def hello(username):  
    if username == 'handsomescj':  
        return 'Hello {}' .format(username)  # 如果用户名是 'handsomescj',则返回欢迎信息  
    else:  
        return redirect(url_for('index'))  # 否则重定向到根路径  
  
# 主程序入口  
if __name__ == '__main__':  
    app.run(debug=True)  # 运行 Flask 应用,并开启调试模式
​
请注意,代码中有个小的错误,app =Flask(__name__) 这一行应该去掉变量名 app 前的空格,修改为 app = Flask(__name__)。
​
在 Flask 应用中,注释是一个很好的习惯,它们可以帮助你和其他开发者理解代码的功能和逻辑。在编写代码时,记得添加足够的注释,尤其是在复杂的逻辑部分。

7模板渲染

python
#!/usr/bin/env python3  
  
# 导入 Flask 框架  
from flask import Flask  
from flask import url_for  
from flask import redirect  
from flask import render_template  
  
# 初始化 Flask 应用  
app = Flask(__name__)  
  
# 设置路由到根路径 '/'  
@app.route('/')  
def index():  
    return 'Hello World!'  # 返回欢迎信息  
  
# 设置路由到 '/a'  
@app.route('/a')  
def add():  
    return '1+1=2'  # 返回加法运算结果  
  
# 设置路由到 '/user/<username>',其中 <username> 是一个动态部分  
@app.route('/user/<username>')  
def user_index(username):  
    # 使用 render_template 函数渲染 'user_index.html' 模板,并传入变量 username  
    return render_template('user_index.html', username=username)  # 返回渲染后的页面  
  
# 设置路由到 '/post/<int:post_id>',其中 <int:post_id> 是一个整数类型的动态部分  
@app.route('/post/<int:post_id>')  
def show_post(post_id):  
    return 'Post {} '.format(post_id)  # 返回包含帖子ID的字符串  
  
# 设置路由到 '/test'  
@app.route('/test')  
def test():  
    # 使用 url_for 函数生成路由的 URL,并打印出来  
    print(url_for('index'))  # 打印根路径的 URL  
    print(url_for('user_index', username='scj'))  # 打印用户路径的 URL,传入用户名 'scj'  
    print(url_for('show_post', post_id=1))  # 打印帖子路径的 URL,传入帖子ID 1  
    return 'test'  # 返回测试字符串  
  
# 设置路由到 '/<username>',其中 <username> 是一个动态部分  
@app.route('/<username>')  
def hello(username):  
    if username == 'handsomescj':  
        return 'Hello {}' .format(username)  # 如果用户名是 'handsomescj',则返回欢迎信息  
    else:  
        return redirect(url_for('index'))  # 否则重定向到根路径  
  
# 主程序入口  
if __name__ == '__main__':  
    app.run(debug=True)  # 运行 Flask 应用,并开启调试模式
​

新建templates 文件夹

以及在templates 文件中新建user_index.html

<h1>hello,{{ username }}!</h1>

8 get与post请求

get请求

#!/usr/bin/env python3
​
from flask import Flask
from flask import url_for
from flask import redirect
from flask import render_template
​
#初始化
app =Flask(__name__)
​
#设置多个路由
@app.route('/')
def index():
    return  'Hello World!'
​
@app.route('/a')
def add():
    return  '1+1=2'
​
@app.route('/user/<username>')
def user_index(username):
    #在函数中指明变量名称username,就能获取到通过路由传入的变量username
    return render_template('user_index.html',username=username)
​
@app.route(' /user/<password>' )
def user_password(password) :
    print( 'User-Agent :' , request.headers.get ( 'User-Agent ' ))
    print( 'time: ' , request.args. get( 'time'))
    print( 'q: ' , request.args. get( 'q'))
    print ( 'issinge : ' , request.args.get( ' issinge ' ))
    return ' password is{} '.format(password)
​
@app.route('/post/<int:post_id>')
def show_post(post_id):
    return 'Post {} '.format(post_id)
​
@app.route('/test')
def test():
    print(url_for('index'))
    print(url_for('user_index',username='scj'))
    print(url_for('show_post',post_id=1))
    return 'test'
​
@app.route('/<username>')
def hello(username):
    if username =='handsomescj':
        return 'Hello {}' .format(username)
    else:
        return redirect(url_for('index'))
​
if __name__ == '__main__':
    app.run(debug=True)
​

post请求

#!/usr/bin/env python3  
  
from flask import Flask, request, render_template, redirect, url_for  
  
# 初始化  
app = Flask(__name__)  
  
# 设置多个路由  
@app.route('/')  
def index():  
    return 'Hello World!'  
  
@app.route('/a')  
def add():  
    return '1+1=2'  
  
@app.route('/user/<username>')  
def user_index(username):  
    # 在函数中指明变量名称username,就能获取到通过路由传入的变量username  
    return render_template('user_index.html', username=username)  
  
@app.route('/user/<password>')  
def user_password(password):  
    print('User-Agent:', request.headers.get('User-Agent'))  
    print('time:', request.args.get('time'))  
    print('q:', request.args.get('q'))  
    print('issinge:', request.args.get('issinge'))  
    return 'password is {}'.format(password)  
  
@app.route('/post/<int:post_id>')  
def show_post(post_id):  
    return 'Post {}'.format(post_id)  
  
@app.route('/test')  
def test():  
    print(url_for('index'))  
    print(url_for('user_index', username='scj'))  
    print(url_for('show_post', post_id=1))  
    return 'test'  
  
@app.route('/<username>')  
def hello(username):  
    if username == 'handsomescj':  
        return 'Hello {}'.format(username)  
    else:  
        return redirect(url_for('index'))  
  
@app.route('/register', methods=['GET', 'POST'])  
def register():  
    print('method:', request.method)  
    print('name:', request.form['name'])  
    print('password:', request.form.get('password'))  
    print('hobbies:', request.form.getlist('hobbies'))  
    print('age:', request.form.get('age', default=18))  
    return 'register success!'  
  
if __name__ == '__main__':  
    app.run(debug=True)
​

新建client.py

#!/usr/bin/env python3  
  
import requests  
  
# 设置需要发送的数据  
user_info = {  
    'name': 'scj',  # 去掉键和值之间的空格  
    'password': '123456',  # 去掉键和值之间的空格  
    'hobbies': ['code', 'run']  # 列表中的字符串去掉空格  
}  
  
# 向url发送post请求  
r = requests.post("http://127.0.0.1:5000/register", data=user_info)  
  
print(r.status_code)  # 打印请求返回的状态码

9session与cookie

#!/usr/bin/env python3  

from flask import Flask
from flask import url_for
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import make_response

# 初始化  
app = Flask(__name__)  

app.secret_key='kdjklfjkd87384hjdhjh'
  
# 设置多个路由  
@app.route('/')  
def index():  
    return 'Hello World!'  
  
@app.route('/a')  
def add():  
    return '1+1=2'  
  
#@app.route('/user/<username>')  
#def user_index(username):  
    # 在函数中指明变量名称username,就能获取到通过路由传入的变量username  
    #return render_template('user_index.html', username=username)  
  
@app.route('/user/<password>')  
def user_password(password):  
    print('User-Agent:', request.headers.get('User-Agent'))  
    print('time:', request.args.get('time'))  
    print('q:', request.args.get('q'))  
    print('issinge:', request.args.get('issinge'))  
    return 'password is {}'.format(password)  
  
@app.route('/post/<int:post_id>')  
def show_post(post_id):  
    return 'Post {}'.format(post_id)  
  
@app.route('/test')  
def test():  
    print(url_for('index'))  
    print(url_for('user_index', username='scj'))  
    print(url_for('show_post', post_id=1))  
    return 'test'  
  
@app.route('/<username>')  
def hello(username):  
    if username == 'handsomescj':  
        return 'Hello {}'.format(username)  
    else:  
        return redirect(url_for('index'))  
  
@app.route('/register', methods=['GET', 'POST'])  
def register():  
    print('method:', request.method)  
    print('name:', request.form['name'])  
    print('password:', request.form.get('password'))  
    print('hobbies:', request.form.getlist('hobbies'))  
    print('age:', request.form.get('age', default=18))  
    return 'register success!'  
    
@app.route('/set_session')  
def set_session():  
    # 设置session的持久化  
    session.permanent = True  
    session['username'] = 'scj' 
    return '成功设置session'  
  
@app.route('/get_session')  
def get_session():  
    value = session.get('username')    
    return '成功获取session值为:{}'.format(value)
    
@app.route('/set_cookie/<username>')  
def set_cookie(username):  
    resp = make_response(render_template('user_index.html', username=username))  
    resp.set_cookie('user', username)  # 使用'user'作为cookie的名字  
    return resp  
  
@app.route('/get_cookie')  
def get_cookie():  
    username = request.cookies.get('username')  # 使用'user'来检索cookie的值  
        return 'Hello {}'.format(username)  # 修正格式化字符串的语法  
    
  
if __name__ == '__main__':  
    app.run(debug=True)

10 errot404

#!/usr/bin/env python3  

from flask import Flask
from flask import url_for
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import make_response


# 初始化  
app = Flask(__name__)  

app.secret_key='kdjklfjkd87384hjdhjh'
  
# 设置多个路由  
@app.route('/')  
def index():  
    return 'Hello World!'  
  
@app.route('/a')  
def add():  
    return '1+1=2'  
  
@app.route('/user/<username>')  
def user_index(username):  
   if username == 'invalid'
   		abort(404)
   	return render_template('user_index.html',username=username)
  
@app.route('/user/<password>')  
def user_password(password):  
    print('User-Agent:', request.headers.get('User-Agent'))  
    print('time:', request.args.get('time'))  
    print('q:', request.args.get('q'))  
    print('issinge:', request.args.get('issinge'))  
    return 'password is {}'.format(password)  
  
@app.route('/post/<int:post_id>')  
def show_post(post_id):  
    return 'Post {}'.format(post_id)  
  
@app.route('/test')  
def test():  
    print(url_for('index'))  
    print(url_for('user_index', username='scj'))  
    print(url_for('show_post', post_id=1))  
    return 'test'  
  
#@app.route('/<username>')  
#def hello(username):  
#    if username == 'handsomescj':  
#        return 'Hello {}'.format(username)  
 #   else:  
#        return redirect(url_for('index'))  
  
@app.route('/register', methods=['GET', 'POST'])  
def register():  
    print('method:', request.method)  
    print('name:', request.form['name'])  
    print('password:', request.form.get('password'))  
    print('hobbies:', request.form.getlist('hobbies'))  
    print('age:', request.form.get('age', default=18))  
    return 'register success!'  
    
@app.route('/set_session')  
def set_session():  
    # 设置session的持久化  
    session.permanent = True  
    session['username'] = 'scj' 
    return '成功设置session'  
  
@app.route('/get_session')  
def get_session():  
    value = session.get('username')    
    return '成功获取session值为:{}'.format(value)
    
@app.route('/set_cookie/<username>')  
def set_cookie(username):  
    resp = make_response(render_template('user_index.html', username=username))  
    resp.set_cookie('user', username)  # 使用'user'作为cookie的名字  
    return resp  
  
@app.route('/get_cookie')  
def get_cookie():  
    username = request.cookies.get('username')  # 使用'user'来检索cookie的值  
        return 'Hello {}'.format(username)  # 修正格式化字符串的语法  
        
@app.route(404)
def not_found(error):
	return render_template('404.html'),404
    
  
if __name__ == '__main__':  
    app.run(debug=True)

404.html

错了,sb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1599413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈的应用-四则运算表达式求值

文章目录 栈的应用-四则运算表达式求值1. 后缀&#xff08;逆波兰&#xff09;表示法2. 后缀&#xff08;逆波兰&#xff09;表达式计算3. 中缀表达式转换成后缀表达式 栈的应用-四则运算表达式求值 1. 后缀&#xff08;逆波兰&#xff09;表示法 我们平时写的数学计算表达式…

Proxmox VE 实现批量增加多网络

前言 实现批量创建多网络&#xff0c;更改主机名称&#xff0c;hosts解析 初始化网卡&#xff0c;主机名称&#xff0c;hosts解析&#xff0c;重启网卡 我的主机六个网卡&#xff0c;使用的有四个网卡&#xff0c;以下一键创建和初始化主机名称我是以硬件的SN号最为主机的名…

大数据、数据架构、推荐冷启动...小红书的 AI 数据新方案都在这个会

伴随着行业数据持续积累&#xff0c;人工智能正加速渗透各类场景&#xff0c;大数据、数据架构和推荐系统等领域&#xff0c;依然是各行各业目之所聚。4 月 19 至 20 日&#xff0c;「DataFunCon 2024 上海站」来袭&#xff01;大会以“数聚垂域&#xff0c;智领未来”为主题…

超100万用户,迅速登顶 GitHub!运行在浏览器中的开源桌面操作系统,不到一个月拿下 10k star【文末福利】

Puter 是近日在 GitHub 上最受欢迎的一款开源项目&#xff0c;正式开源还没到一个月 ——star 数就已接近 10.1k。 作者表示这个项目已开发 3 年&#xff0c;并获得了超过 100 万用户。 Puter介绍 根据介绍&#xff0c;Puter 是基于 Web 的桌面操作系统&#xff0c;运行于浏览…

数据结构——栈(C++实现)

数据结构——栈 什么是栈栈的实现顺序栈的实现链栈的实现 今天我们来看一个新的数据结构——栈。 什么是栈 栈是一种基础且重要的数据结构&#xff0c;它在计算机科学和编程中扮演着核心角色。栈的名称源于现实生活中的概念&#xff0c;如一叠书或一摞盘子&#xff0c;新添加…

贝锐蒲公英企业路由器X5 Pro:无需专线和IT人员,分钟级异地组网

尽管我们公司规模较小&#xff0c;只有十几个人&#xff0c;但为了确保项目资料的安全&#xff0c;依旧在公司内部自建了文件存储服务器和办公系统。 但是&#xff0c;随着项目数量的增加&#xff0c;大家出差办公的情况也愈发普遍&#xff0c;如何解决远程访问内部系统成了问…

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 轻松文生视频

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 &#x1f4fa;轻松文生视频 学习前言源码下载地址技术原理储备&#xff08;DIT/Lora/Motion Module&#xff09;什么是Diffusion Transformer (DiT)LoraMotion Module EasyAnimate简介EasyAnimate原理界面展示快速启动云…

《中医临床诊疗术语》数据库

最新版的《中医临床诊疗术语》于2023年3月17日由国家中医药管理局提出的&#xff0c;由国家市场监督管理总局和国家标准化管理委员会共同发布。新版的修订是为落实相关政策文件要求&#xff0c;推进中医医疗服务规范化、标准化管理&#xff0c;提高中医医疗服务标准化水平和管理…

Web前端开发——Ajax,Axios概述及在Vue框架中的使用

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! Ajax Ajax是什么&#xff1f; Ajax全称Asynchromous JavaScript And Xml&#xff0c;是异步的JavaScript和Xml。 Ajax的作用&#xff1f; 1&#xff0c;数据交换&#xff1a;通过Ajax可以给服务器…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash&#xff1a;对象类型的数据&#xff0c;购物车List&#xff1a;队列/栈Set&#xff1a;String类型的无序集合&#xff0c;intset&#xff0c;抽奖、签到、打卡&#xff0c;商品评价标签Sorted Set&#xff1a;存储有序的元素&#xff0c;zip…

二叉树的先中后序遍历

什么是遍历呢&#xff1f; 遍历:按照某种次序把所有结点都访问一遍 先/中/后序遍历:基于树的递归特性确定的次序规则 二叉树的递归特性: ①要么是个空二叉树 ②要么就是由“根节点左子树右子树”组成的二叉树 先序遍历:根左右&#xff08;NLR) ——先访问根结点&#xff0c;…

抖音小店新店铺起飞式玩法,这几步一定要做好,前期很重要

大家好&#xff0c;我是电商笨笨熊 进入抖音小店后不知道该怎么操作&#xff0c;不清楚如何让新店快速起店&#xff1b; 今天我们就来聊聊新店铺快速起店的几个关键步骤&#xff0c;新手玩家一定要按照流程去做。 第一步&#xff1a;店铺搭建 小店开通之后不要着急选品上架&…

FreeRTOS_day1

1.总结keil5下载代码和编译代码需要注意的事项 下载代码前要对仿真进行设置 勾选后代码会立刻执行 勾选后会导致代码不能执行 写代码的时候要写在对应的begin和end之间&#xff0c;否则会被覆盖 2.总结STM32Cubemx的使用方法和需要注意的事项 ①打开软件&#xff0c;新建工程…

项目7-音乐播放器2(上传音乐+查询音乐+拦截器)

0.加入拦截器 之后就不用对用户是否登录进行判断了 0.1 定义拦截器 0.2 注册拦截器 生效 1.上传音乐的接口设计 请求&#xff1a; { post, /music/upload {singer&#xff0c;MultipartFile file}&#xff0c; } 响应&#xff1a; { "status": 0, "message&…

【Android】Activity task和Instrumentation杂谈

文章目录 activity taskInstrumentation机制参考 Android不仅可以装载众多的系统组件&#xff0c;还可以将它们跨进程组成ActivityTask&#xff0c;这个特性使得每个应用都不是孤立的。 activity task 从数据结构角度看&#xff0c;Task有先后之分&#xff0c;源码实现上采取了…

AI人工智能老师大模型讲师叶梓 OneLLM:开创性的多模态大型语言模型技术

在人工智能领域&#xff0c;多模态大型语言模型&#xff08;MLLM&#xff09;的研究一直是一个热门话题。近期&#xff0c;一种名为OneLLM的创新技术引起了业界的广泛关注。OneLLM通过其独特的统一框架&#xff0c;实现了多种不同模态与自然语言的高效对齐&#xff0c;为多模态…

加拿大银行入局,强化数字货币的量子安全防护

领先的量子网络安全公司EvolutionQ此前宣布与加拿大银行签订合同&#xff0c;为加拿大银行的一个研究项目做出贡献&#xff0c;该项目涉及绿地数字货币的量子安全网络安全技术。这项工作强调了EvolutionQ致力于理解量子计算机对新兴金融技术&#xff08;如数字货币&#xff09;…

社区养老服务系统|基于springboot社区养老服务系统设计与实现(源码+数据库+文档)

社区养老服务系统目录 目录 基于springboot社区养老服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员部分功能 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;服务种类管理 &#xff08;3&#xff09;社区服务管理 &#xff08…

怎样编写测试团队通用的JMeter脚本

1、确定测试目标和场景&#xff1a; 与团队成员共同明确测试的目标&#xff0c;例如性能评估、负载测试、稳定性测试等。 确定要测试的具体业务场景和使用案例&#xff0c;比如用户登录、搜索功能、购物流程等。 2、学习 JMeter 工具和基础知识&#xff1a; 阅读 JMeter 官…

JS -a标签和this在DOM的使用、使用DOM完成点击按钮操作div块和获取div块的CSS样式

a标签的索引问题和this <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…