flask入门
文章目录
创建虚拟环境
python3创建方法;
1.pip install python3-env
2.python3 -m venv <虚拟环境文件名> 或者 python -m venv <虚拟环境名字>
3.进入该虚幻环境 并激活 激活指令activate
4.退出虚拟环境 deactivate
python2创建方法:
- pip install virtualenv
- virtualenv <虚拟环境名>
- 进入该虚幻环境 并激活 激活指令activate
- 退出虚拟环境 deactivate
一个基本flask项目目录结构
flask
├── app 该项目文件
│ ├──__ init__.py 初始化文件
│ ├── routes.py 路由设置
│ └── templates 模板文件
│ ├── base.html
│ └── index.html
├── run.py 启动文件
|—–congfig.py 配置文件
路由route
# @app.route是一个装饰器
# 装饰器作用是 做一个url与试图函数的映射
# 通过127.0.0.1:5000/hello 可以请求hello()视窗函数
@app.route("/hello/")
def hello(id):
return "请求参数是 " + id
设置debug模式
作用:项目运行中如果修改了某些代码,会自动重新加载项目
f __name__ == "__main__":
#这个项目运行,是一个监听的状态,一直运行
#while(True):
# listen();
#app.run(host,port,debug,options);都是可变参数
app.run()
url传参数
作用:1.可以相同的url下获得不同的数据
2.在flask如何使用参数
@app.route("/hello/<id>")
def hello(id):
return "请求参数是 " + id
#反转url 通过视窗函数获得url
#使用url_for("视窗函数"),url("视窗函数",“参数”)来获得url
@app.route("/")
def index():
print(url_for("my_list"))
print (url_for("hello",id=3))
return "hello world "
###当视窗函数有参数时,要传参数。
###好处:页面重定向,页面跳转的时候
#简单实现重定向
##重定向方法:redirect
@app.route("/login")
def login():
return "这是登陆界面"
@app.route("/logined")
def logined():
return "这是登陆后的界面"
@app.route("/index/<is_login>")
def index(is_login):
if is_login=="1":
logined_url=url_for("logined")
return redirect(logined_url)
else:
login_url=url_for("login")
return redirect(login_url)
#说明:本来是index界面,通过简单的判断,来重定向返回不同的界面。
##### 如果参数是1,那么判断返回登陆后的界面,否则返回登陆界面
模板templates
Flask渲染jinja2模板和传参
- 模板放在templates文件下
- 从flask中导入render_template方法渲染模板
- 注意:在视图函数中返回render_template(“模板名”),不需要填写templates路径
#1.模板传参
##index.html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>first</title>
</head>
<body>
<!-- {{username}}是一个flask语法>
<p> 你好:{{username}}</p>
</body>
</html>
##2.模板渲染。返回index.html模板,同时返回了一个参数username
@app.route("/")
def index():
return render_template("index.html",username="zhangchuan")
#3.返回多个参数
##使用可变参数,一次返回多个参数
@app.route("/")
def index():
context={"name":"张川",
"gender":"男",
"is_handsome":"yes"}
return render_template("index.html",username="zhangchuan",**context)
#4.访问模型中字典或者对象的属性
##使用{{params.property}}形式,也可以是{{params["property"]}},
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>first</title>
</head>
<!--用python获取字典某键的value方法>
<p> 百度:{{websites["baidu"]}}</p>
<p>google:{{websites["google"]}}</p>
<!--第二种 websites.baidu 方法>
<p> 百度:{{websites.baidu}}</p>
<p>google:{{websites.google}}</p>
<body>
@app.route("/")
def index():
context={"name":"张川",
"gender":"男",
"is_handsome":"yes",
"websites":{"baidu":"www.baidu.com",
"google":"www.google.com"}}
return render_template("index.html",**context)
在模板中使用python语句
语法:{% python语句 %}
{%end for%}
#注意结束语句 {%end for%}
过滤器
作用:处理变量
语法:
{{params|default(new params)}}
default过滤器:如果avater参数不存在,就返回|后的参数
还有其他过滤器查找官网。
模板继承和使用block
#继承base.html界面
{%extends base.html%}
{%block%}
//内容
{%endblock%}
这是base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
<style>
.index{
background: #3a3a3a;
height:65px;
}
ul li{
float:left;
list-style:none;
padding:0 10px;
line-height: 65px;
}
ul li a{
color: #ffffff;
}
</style>
</head>
<body>
<div class="index">
<ul>
<li><a href="url_for("index")">首页</a></li>
<li><a href=url_for("login")>登录</a></li>
<li><a href="urll_for("register") >注册</a></li>
</ul>
</div>
{%block main%}{%endblock%}
</body>
</html>
继承的界面
<!--这是首页继承base.html页面--!>
{% extends 'base.html'%}
{%block main%}
<h1>这是首页</h1>
{%endblock%}
<!--这是登录界面继承base.html页面--!>
{% extends "base.html"%}
{%block main%}
<h1>这是登录界面</h1>
{%endblock%}
加载静态文件
j加载图片,加载css,视屏,js都是如此
语法:{{url_for(‘static’,filename=‘css/index.css’)}}
{{url_for(‘static’,filename=‘images/follow.ico’)}}
数据库配置
在_init_.py中使用添加如下
from flask-sqlalchemy import SQLAlchemy
app=Flask(__name__)
#建立数据库关系
db=SQLAlchemy(app)
在config.py中添加
#数据库格式 dialect+driver://username:password@host:port/database
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/flask-blog'
SQLALCHEMY_TRACK_MODIFICATIONS =False
在models.py中创建数据库模型
使用SQlAlchemy实现app应用与数据库的绑定
ORM对象关系映射
面向对象概念 | 面向关系概念 |
---|---|
类 | 表 |
对象 | 一条记录 |
属性 | 字段 |
#创建数据库模型
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True,autoincrement=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
db.create_all()
使用Migrate库实现数据库模型映射到数据库中
创建manage.py
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from app import app,db
from app.models import User,Blog
"""
flaskweb应用实例app与数据库绑定,使用Migrate库 方便操作web应用与数据库
数据库模型迁移: 模型--->迁移文件-->数据库中表创建
"""
manager=Manager(app)
#绑定app和数据库,以便进行操作web应用app与数据库
migrate = Migrate(app,db)
#把MigrateCommand命添加到manager中
manager.add_command('db',MigrateCommand)
if __name__=="__main__":
manager.run()
之后使用cmd进入该项目虚拟环境输入命令:
- python manage.py db init 首先使用init命令初始化环境
- python manage.py db migrate 生成迁移文件migrations
- python mannage.py db <migrations中的一些指令>
curd操作增删改查
user1=User(username="zhangsan",email="21321242@qq.com")
#添加到会话
db.session.add(user1)
#提交,才会增加到数据库中
db.session.commit()
flask中的seesion机制
把敏感数据经过加密放入‘session’中,再放入浏览器中的cookie中,下次请求的时候,读取浏览器发送的cookie中读取session,最后读取session解密获取数据。。
flask把所有敏感数据都放入了浏览器中。
操作session
操作session就与操作字典一样
1.添加session
session[‘username’]=‘zhangsan’
2.删除
session.pop(‘username’)
3.删除所有session
session.clear()
4.获取session
session.get(‘username’)
实例:
#使用session需要设置一个SERCRET_KEY,作为加密使用的
import os
app.config['SECRET_KEY']=os.urandom(24)
@app.route('/')
def index():
session['username']='zhangsan'
return 'hello world'
这样就给 ‘username’:‘zhangsan’这条信息加密了
并且flask自动将其放在session中并放入了浏览器的cookie中
注意:由于是随机给的24位的SERCRET_KEY 所以每次重新运行服务器的时候,每次加密的就不一样,就会导致不能正确解析 加密信息。所以可以写死SERCRET_KEY,这样每次重新运行服务器也可以解析加密信息。
浏览器中查看cookie 。
flask请求对象request
一些属性和方法
flask响应对象response
post和get请求获取参数
1.get请求是通过“flask.request.args”获取
2.post请求时通过“flask.request.form”获取表单数据
3.post请求获取表单数据注意事项
*input标签中需要使用name标识这个value的key,方便后台获取数据
*form表单需要指明method=‘POST’,action="/login/"或者“{{url_for(‘login’)}}”来指明哪个链接,也就是哪个视窗函数来接收这个表单数据
示例代码
form aciton="{{url_for('register')}}" method="POST">
<div class="form-container">
<div class="form-group">
<input type="text" class="form-control" name='telephone'placeholder="手机号码">
</div>
<div class="form-group">
<input type="password" class="form-control" name='password' placeholder="密码">
</div>
<div class="form-group">
<button class="btn btn-primary btn-block">注册</button>
</div>
</div>
</form>
后台代码:
@app.route("/register/",methods=["GET","POST"])
def register():
if request.method=="GET":
return render_template("register.html")
else:
#获取表单数据
telephone = request.form.get("telephone")
password=request.form.get('password')
个人博客项目效果图。需要de,移步我的资源: https://download.csdn.net/download/weixin_43919632/11424229