Web前端—Flask、Jinja2入门

一、 flask简介

背景:
首先看一下用户通过浏览器访问网站的页面信息,经过了哪些?

  • flask与http没有协议,不可以与nginx直接沟通,需要uwsgi,wsgi可以与flask通过web协议沟通,也可以与nginx沟通;
  • 当用户访问url时,通过函数返回结果给wsgi,wsgi再给nginx

在这里插入图片描述

  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP / POP3 / SMTP服务。接收的请求量大,10K。
  • uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。http协议和nginx进行交流,WSGI协议和后端的python代码,wed框架进行交流。
  • Framework即架构,它是一个语言开发软件,提供了软件开发的框架,使开发更具工程性、简便性和稳定性。常用的就是django和falsk框架,falsk用于小项目,django用于大项目。

Flask简介
Flask是一个Web框架,就是提供一个工具库和技术来允许你构建一个Web应用程序.这个Web应用程序可以是一些Web页面,博客, wiki ,基于 Web 的日历应用或商业网站。

Flask依赖模块:
web服务网关接口(Python Web Server Gateway Interface,缩写为WSGI)

  • Werkzeug 一个WSGI工具包, 是为python语言定义的web服务器和web应用程序或框架之间的一种简单而通用的接口,其他语言也有类似的接口)
  • jinja2模板引擎。前端的操作。

Flask的优势:
Flask属于微框架( micro-framework )这一类别,微架构通常是很小的不依赖外部库的框架.
框架很轻量
更新时依赖小
专注于安全方面的bug

基于flask建立一个网站

路由:url地址的路径,路由根据用户提交的路径,判断执行什么函数

@app.route('/login/') #当用户输入网址/login/所对应的路由

视图函数:用户输入网址对应到路由下所执行的函数

 def login():
     return 'logining..'  #当用户访问登陆页面时返回logining
from flask import Flask

# 实例化,__name__:确定flask项目所在位置
app = Flask(__name__)

#实现首页:http://访问的ip:端口/
#路由:确保访问的路径,执行哪个函数
@app.route('/')  # 路由
def index():     # 试图函数 ,给用户返回页面信息,名字不能重复
    return '这是网站的首页'

@app.route('/login/')
def login():
    return '正在登录'

@app.route('/logout/')
def logout():
    return '正在登出'


if __name__ == '__main__':
    #运行flak项目,默认ip和端口是127.0.0.1:5000
    #如何特色化指定?host=0.0.0.0 开放本机所有的ip port=9990 端口必须是整形数
    #debug=True 是否开启调试,测试环境中开启,生产环境一定要关闭
    app.run(host='0.0.0.0', port=9990, debug=True)

  • 设置动态路由
from flask import Flask, request  # 请求信息存在request

app = Flask(__name__)

"""
动态路由方式一: http://www.csdn.org/<userid>
"""
#路由是一个变量
@app.route('/<int:userid>/')  #接收了一个变量信息 userid
def userinfo(userid):
    return "查看用户%s的详细博客" %(userid)

@app.route('/welcome/<string:username>')
def welcome(username):
    return "欢迎访问%s用户的主页" %(username)

"""
动态路由方式二: https://movie.douban.com/top250?start=25&filter=
                有对应的 key value值
"""
@app.route('/top250')
def top250():
    users = ['user%s' %(i) for i in range(100)]
    # request 存储用户请求页面的所有头部信息
    print('客户端的用户代理:',request.user_agent)
    print('请求页面的头部信息:',request.headers)
    print('客户端ip:',request.remote_addr)
    print('客户端请求的参数详细信息:',request.args)  #字典对象存储
    print('客户端http请求的方法:',request.method)  # http请求方法 get:会在地址栏显示,不安全,有大小限制 opst
    # 获取用户请求的URL地址里的key对应的value值
    start = int(request.args.get('start'))  #start对应value值为字符串类型,需要转为int型才能和int相加
    user = request.args.get('user')
    # return 'top 250 显示数据:%s条 用户名:%s' %(start,user)
    import json
    return json.dumps(users[start:start+10])  # users[start:start+10] 是一个列表,返回一个字符串内容

if __name__ == '__main__':
    app.run()

二、http请求方法的实现

1、 http请求常见的方式:GET POST

  • (1) url可见性:
    get: 参数url可见
    post: 参数不可见

  • (2) 数据传输:
    get: 通过拼接url进行传递参数
    post: 通过body体传输参数

  • (3) 缓存性:
    get请求是可以缓存的
    post请求不可以缓存

  • (4) 后退页面的反应:
    get请求页面后退时,不产生影响
    post请求页面后退时,会重新提交请求

  • (5) 传输数据的大小:
    get一般传输数据大小不超过2-4k(根据浏览器不同,限制不一样,但相差不大)
    post请求传输数据可以无限大

  • (6) 安全性:原则上
    get安全性较低
    post安全性较高

2、 模板渲染

例如: hello { {name}} 一个模板,取决于用户给返回的值
若用户返回的信息为:name = westos
就将name=westos填入 —> hello westos
flask和django都配备了Jinja2模板引擎,可以使用 render_template() 方法来渲染模板

3、 重定向和错误(redirect, error)

  • 使用redirect()函数把用户重定向到其他地方
  • 使用abort()函数,放弃请求并返回错误代码
    http状态码:404 200 304 302 500
    4开头 客户端错误
    5开头 服务端错误

4、get方法实现用户登录验证


from flask import Flask, render_template, request, redirect

app = Flask(__name__)
@app.route('/')
def index():
    return "<h1>主页</h1>"

@app.route('/login/')
def login():
    """
    一般情况下,不会直接把html文件内容直接返回,
    而是将html文件保存到当前的templates目录中
    通过render_template方法调用;
    默认情况下,flask在程序文件夹中的templates子文件夹中寻找模板
    """
    return render_template('login.html')

# 返回了login.html,去login.html里看,用户输入了登录信息后,提交到action="/login2/  login2路由中
# 再通过login2函数来判断用户名和密码,正确就进入主页,否则重新登陆


# 处理登录逻辑,判断用户名和密码
@app.route('/login2/')
def login2():
    #获取用户输入的用户名
    username = request.args.get('username', None)
    password = request.args.get('password', None)
    # 逻辑处理,判断用户名和密码是否正确
    if username == 'root' and password == 'root':
        #重定向到指定路由
        #如果登录成功,进入主页
        return redirect('/')
    else:
        #return '登录失败'
        #如果登录失败,重定向到登录界面,重新登录
        return redirect('/login/')


if __name__ == '__main__':
    app.run()

templates目录中的login.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>用户登录</h1>

<form action="/login2/" method="get"> 
  
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值