Python框架Flask基础学习

Python框架Flask基础学习

简介

Flask是由python实现的一个web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。而且有对应的python3及python2版本。

环境

  • windows10系统
  • python2.7(之所以是2.7而不是3.x,因为大多数库只支持2.x)
  • 已安装pip(Python包管理工具)

安装

  1. 建立:找一个目录建立flask文件夹
  2. 安装virtualenv,再此目录打开命令行窗口输入:
pip install virtualenv
  1. 新建一个目录,并在里边创建virtualenv环境,在DOS下
mkdir demo
cd demo
virtualenv venv

这时你创建的myproject文件夹里面就多了一个venv文件夹

激活虚拟环境

venv\scripts\activate.bat

5.在virtualenv里面安装Flask

pip  install Flask

至此flask环境已经搭好了。

目录结构

通过别人的目录大致了解flask框架的目录结构

flask-demo/
  ├ run.py           # 应用启动程序
  ├ config.py        # 环境配置
  ├ requirements.txt # 列出应用程序依赖的所有Python包
  ├ tests/           # 测试代码包
  │   ├ __init__.py 
  │   └ test_*.py    # 测试用例
  └ myapp/
      ├ admin/       # 蓝图目录
      ├ static/
      │   ├ css/     # css文件目录
      │   ├ img/     # 图片文件目录
      │   └ js/      # js文件目录
      ├ templates/   # 模板文件目录
      ├ __init__.py    
      ├ forms.py     # 存放所有表单,如果多,将其变为一个包
      ├ models.py    # 存放所有数据模型,如果多,将其变为一个包
      └ views.py     # 存放所有视图函数,如果多,将其变为一个包

Hello world

from flask import Flask

app = Flask(__name__)

@app.route('/')

def  hello():
	return "Hello World"

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

使用python运行后访问localhost:5000就能看到网页显示Hello world。

debug模式

开启debug模式

app.run(debug=True)
也可以分开写:
app.debug = True
app.run()

作用

  • 将报错信息输出到页面
  • 开启debug的文件内容如果被改动,就会自行重启服务器,也就是重新加载,不用在去重新运行python 1.py

路由

flask通过route()装饰器将一个函数绑定到对应的URL上面

例如

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
	return 'Hello World!'
@app.route('/admin')
def index():
	return 'This is admin page!'
if __name__ =='__main__':
	app.debug = True
	app.run()

当我们访问localhost:5000/,就能在页面上看到Hello World!
当我们访问localhost:5000/admin,就能在页面上看到This is admin page!

参数类型

flask支持在路由上制定参数及参数类型,通过<variable_name>可以标记变量,这个部分将会作为命名参数传递到你的函数,也可以通过<converter:variable_name>指定一个可选的装饰器:

from flask import Flask

app = Flask(__name__)

@app.route('/admin/<username>')
def show_user_profile(username):
    return 'admin %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id,post_name):
    return 'Post_id is %d ' % post_id

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

这里访问localhost:5000/admin/user1,会看到admin user1
访问localhost:5000/post/1,会看到Post_id is 1,且必须为int型,因为这里限制了参数类型。

类型转换器作用
缺省字符型,但不能有斜杠
int:整型
float:浮点型
path:字符型,可有斜杠

HTTP方法

如果需要处理具体的HTTP方法,在Flask中也很容易,使用route装饰器的methods参数设置即可。

# -*- coding: utf-8 -*-
from flask import Flask,request
import sys

reload(sys)
sys.setdefaultencoding("utf8")

app = Flask(__name__)


@app.route('/getone',methods=['GET'])
def show_get():
	# name = request.args  #{"age": "12", "name": "a"}
	name = request.args['name']
	age = request.args['age']
	return 'Your name is %s  age is %s' % (name,str(age))

@app.route('/get', methods=['GET'])
def show():
	get_methods = request.args.items()   #可以获取get的全部参数   存储方式: [('age', u'12'), ('name', u'a')]
	return '第一个参数名字为 %s  他的值为 %s  第二个参数名字为  %s   他的值为:  %s' % (get_methods[0][0],str(get_methods[0][1]),get_methods[1][0],get_methods[1][1])

@app.route('/post',methods=['POST'])
def show_post():
	name = request.form['name']
	age = request.form['age']
	return 'Your name is %s  age is %s' % (name,str(age))

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

其中可以通过request.method来判断请求的类型,是GET还是POST

如果不写明methods的话,post请求将不被允许

request.args.get()方法则可以获取Get请求URL中的参数,该函数的第二个参数是默认值,当URL参数不存在时,则返回默认值

获取get和post传递的参数的方法不同。

  • getrequest.args.get['name']
  • POSTrequest.form.get['name']

唯一 URL / 重定向行为

@app.route('/admin/')
def projects():
    return 'The project page'

@app.route('/user')
def about():
    return 'The about page'

当访问localhost:5000/admin时,flask会自动重定向到正确的地址上。
但是访问localhost:5000/user/时,flask会直接报404的错误。

使用route设置路径的时候最好带上斜线

构造URL

Flask提供了url_for()方法来快速获取及构建URL方法。其第一个参数指向函数名(加过@app.route注解的函数),后续的参数为对应于要构建的URL变量。

url_for('login')    # 返回/login
url_for('login', id='1')    # 将id作为URL参数,返回/login?id=1
url_for('static', filename='style.css')    # 静态文件地址,返回/static/style.css

和redirect一起使用可以达到页面跳转的效果

#encoding: utf-8
from flask import Flask,url_for,request,redirect

app = Flask(__name__)

@app.route('/')
def index():
    login_url = url_for('login') # /login/
    return redirect(login_url)
    return u'这是首页'
 
@app.route('/login/')
def login():
    return  u'这是登陆页面' 
 
@app.route('/question/<is_login>/')
def question(is_login):
    if is_login == '1':
        return  u'这是发布问答的页面'
    else:
        return  redirect(url_for('login'))  # /login/
		return url_for('login',id='admin')
	
if __name__== '__main__':
	app.run(debug=True)

当我们访问localhost:5000/时,会自动跳转到login页面显示这是登陆页面

加载静态文件

  • 语法 url_for('static',filename='路径')
  • 静态文件 ,flask会自动从static文件夹开始寻找,所以不需要再写static这个路径
  • 可以加载css文件,js文件,还有image图片
  • 要把静态文件放在static目录下
url_for('static', filename='style.css')

Flask渲染Jinja2模板和传参(html模板使用)

flask的渲染方法有render_templaterender_template_string两种。

模板的使用需要 导入render_templaterender_template_string 模块。

Flask默认使用Jinja2作为模板,默认情况下,模板文件需要放在templates文件夹下。

调用示例


# return render_template('demo.html')
# return render_template_string('<script>alert(1);</script>')

render_template的具体使用:

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/hello/')
@app.route('/hello/<name>')
def index(name=None):
    return render_template("demo.html", name=name)  

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

demo.html

<html>
  <head>
    <title>admin</title>
  </head>
  <body>
    {% if name %}
		<h1>Hello {{ name }}!</h1>
	{% else %}
		 <h1>Hello World!</h1>
	{% endif %}
  </body>
</html>

当我们访问localhost:5000/hello,页面会输出Hello World!
当我们访问localhost:5000/hello/admin,页面会输出Hello admin!

变量或表达式由{{ ... }}修饰,而控制语句由{% ... %}修饰,其他的代码,就是我们常见的HTML。

模板的继承

模板可以继承其他模板,我们可以将布局设置为父模板,让其他模板继承,这样可以非常方便的控制整个程序的外观。

先写一下block的作用,extends是继承了整个layout.html文件里的所有的公用代码

例如这里有一个layout.html模板,它是整个程序的布局文件。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap.css') }}"/>
    <link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap-theme.css') }}"/>

</head>
<body>

<div class="container body-content">
    {% block body %}{% endblock %}
</div>

<div class="container footer">
    <hr>
    <p>这是页脚</p>
</div>

<script src="{{ url_for('static',filename='js/jquery.js') }}"></script>
<script src="{{ url_for('static',filename='js/bootstrap.js') }}"></script>

对应的继承
show.html

{% extends 'layout.html' %}
{% block title %}主页{% endblock %}
{% block body %}

    <div class="jumbotron">
        <h1>主页</h1>
        <p>本项目演示了Flask的简单使用方法,点击导航栏上的菜单条查看具体功能。</p>
    </div>

{% endblock %}

这里如果不使用block,直接在show.html 中写html代码的话,页面是无法正常显示html代码的。所以要在layout.html中添加一个模板,然后在子文件中使用block来继承模板,然后再在block中写html代码。

block就相当于占位符的作用。

这两个页面相当于这样的一个页面:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>主页</title>
    <link rel="stylesheet" href="static/css/bootstrap.css"/>
    <link rel="stylesheet" href="static/css/bootstrap-theme.css"/>

</head>
<body>

<div class="container body-content">
    <div class="jumbotron">
        <h1>主页</h1>
        <p>本项目演示了Flask的简单使用方法,点击导航栏上的菜单条查看具体功能。</p>
    </div>
</div>

<div class="container footer">
    <hr>
    <p>这是页脚</p>
</div>

<script src="static/js/jquery.js"></script>
<script src="static/js/bootstrap.js"></script>

当我们存在一些重复的页面功能时,我们可以使用这个方法

控制流

if条件判断可以这么写

{%  ...  %}中也可以写Python代码
<html>
  <head>
    <title>admin</title>
  </head>
  <body>
    {% if name %}
		<h1>Hello {{ name }}!</h1>
	{% else %}
		 <h1>Hello World!</h1>
	{% endif %}
  </body>
</html>

循环,和在Python中遍历差不多。

for.py

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/for')
def for_list():
	user = ['admin','test','chuddy','aaa']
	return render_template('for.html',user=user)

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

for.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
</head>
<body>
{%  for i in user %}
<h4>name is :  {{i}}</h4>
{%  endfor %}
</body>
</html>

过滤器

default 如果变量的值为空,则取default设置的值。

demo.html

<html>
  <head>
    <title>admin</title>
  </head>
  <body>
		<h1>Hello {{ name|default('World') }}!</h1>
  </body>
</html>

1.py

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/hello/')
@app.route('/hello/<name>')
def index(name=None):
    return render_template("demo.html", name=name)  

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

常见内建过滤器

字符串操作

    safe:禁用转义              <p>{{ '<em>hello</em>' | safe }}</p> 

    capitalize:把变量值的首字母转成大写,其余字母转小写        <p>{{ 'hello' | capitalize }}</p>

    lower:把值转成小写     <p>{{ 'HELLO' | lower }}</p>

    upper:把值转成大写      <p>{{ 'hello' | upper }}</p>

    title:把值中的每个单词的首字母都转成大写  <p>{{ 'hello' | title }}</p>

    reverse:字符串反转     <p>{{ 'olleh' | reverse }}</p>

    format:格式化输出      <p>{{ '%s is %d' | format('name',17) }}</p>

    striptags:渲染之前把值中所有的HTML标签都删掉      <p>{{ '<em>hello</em>' | striptags }}</p>

    truncate: 字符串截断          <p>{{ 'hello every one' | truncate(9)}}</p>

列表操作

    first:取第一个元素        <p>{{ [1,2,3,4,5,6] | first }}</p>

    last:取最后一个元素      <p>{{ [1,2,3,4,5,6] | last }}</p>

    length:获取列表长度      <p>{{ [1,2,3,4,5,6] | length }}</p>

    sum:列表求和        <p>{{ [1,2,3,4,5,6] | sum }}</p>

    sort:列表排序          <p>{{ [6,2,3,1,5,4] | sort }}</p>

session

from flask import session
app.config['SECRET_KEY'] = os.urandom(24)

#设置session
@app.route('/sess/')
def hi():
session['name'] = 'admin'
return 'hello word'

# 读取session
@app.route('/get/')
def get():
return session.get('name')

# 删除session其中的一个
@app.route('/delete/')
def delete():
print session.get('name')
session.pop('name')
print session.get('name')
return 'successs'

# 清除session中的所用变量
@app.route('/clear/')
def clear():
print session.get('name')
session.clear()
print session.get('name')
return 'successs'

# 设置session过期时间

@app.route('/sess/')
def hi():
session['name'] = 'admin'
# 默认是flase,会话结束后session就过期。设置是True后,过期时间为30天
session.permanent = True
return 'hello word'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值