临沂建站公司,大型网站建设招商,做爰网站1000部,网站建设总体方案设计一、使用pycharm创建项目
1.创建项目 2.调整默认终端 3.打开虚拟终端
打开终端可以看出使用的是p1的虚拟机终端了 4.pyCharm小技巧
在flask种输入一个完整并且存在的函数名称或者类明#xff0c; 然后 Alt 回车#xff0c;pycharm可以自动导包#xff0c;不用在手动在代…一、使用pycharm创建项目
1.创建项目 2.调整默认终端 3.打开虚拟终端
打开终端可以看出使用的是p1的虚拟机终端了 4.pyCharm小技巧
在flask种输入一个完整并且存在的函数名称或者类明 然后 Alt 回车pycharm可以自动导包不用在手动在代码头部导入包
二、安装flask
1.安装flask
(p1) E:\code\p1pip install flask2.查看安装包
pip list查看所有的安装包 pip feeze 查看自己安装包
(p1) E:\code\p1pip freeze
blinker1.7.0
click8.1.7
colorama0.4.6
Flask3.0.0 #这里安装的是3.0.0版本
importlib-metadata7.0.1
itsdangerous2.1.2
Jinja23.1.2
MarkupSafe2.1.3
Werkzeug3.0.1
zipp3.17.0 3.快速启动flask
创建app.py文件
from flask import Flask#创建Flask对象
app Flask(__name__)# 路由 视图函数, 其中 / 就是用户访问的urlhello就是视图函数
app.route(/)
def hello():#返回给浏览器的数据return helloif __name__ __main__:#启动flaskapp.run()4.启动参数
app.run(debugTrue,port5000,host0.0.0.0)debug是开启调试模式每次修改完代码之后不用重启flask三、项目拆分blue print
因为flask所有的路由和视图函数都写在了app文件中一旦逻辑复杂起来函数多起来阅读性就非常差这就需要把项目差分开。这里就使用到了 “蓝图”。蓝图主要是是对 路由 进行了重新规划。 官方推荐了两种蓝图模式这里只写一种。
1.视图基本原理
其原理就是把所有的视图函数文件、静态文件、模板文件都放在一个包中。然后将不通类型的视图函数 分开编写
2.目录结构
app.py #启动文件
apps #这可是一个 自定义的python包__init__.py #包的初始化文件static #存放静态文件的目录templates #存放模板文件的目录views #存放视图函数目录v1.py #视图函数1v2.py #视图函数23.编辑init文件
因为包的初始话文件在其它文件导入的时候会自动执行所有把创建flask的语句写在这里
from flask import Flask#导入两个蓝图
from .views.v1 import blue_login
from .views.v2 import blue_homedef create_app():app Flask(__name__)#将app实例与两个蓝图绑定app.register_blueprint(blue_login)app.register_blueprint(blue_home)return app4.编辑视图文件
编辑v1.py
from flask import Blueprint#创建一个蓝图login为自定义的蓝图名称
blue_login Blueprint(login,__name__)blue_login.route(/login)
def login():return h1用户登录/h1编辑v2.py
from flask import Blueprintblue_home Blueprint(home,__name__)blue_home.route(/home)
def home():return h1用户首页/h15.编辑app.py
from apps import create_appapp create_app()if __name__ __main__:app.run(debugTrue,host0.0.0.0)6.访问
启动flask,分别访问这两个函数就可以看到结果了
http://127.0.0.1:5000/home
http://127.0.0.1:5000/login四、路由参数
有时候需要获取url中的参数这时候就用到了 flask中的路由参数功能
from flask import Flaskapp Flask(__name__)#username是一个string的变量用户输入的url会赋值给username
app.route(/string:username)
def login(username):return usernameif __name__ __main__:app.run(debugTrue,host0.0.0.0)flask支持的类型有以下几种
string
int #int 类型注意flask是不能直接返回int类型的
float
path
any
uuid1.path
path类型如果用户输入得到是多级url 比如 /xx/xx/xx/x/ 都会获取到
from flask import Flaskapp Flask(__name__)app.route(/path:username)
def login(username):return usernameif __name__ __main__:app.run(debugTrue,host0.0.0.0)用户请求多级目录 都会被获取到
http://127.0.0.1:5000/zhangsan/login/aaa2.any
用户请求的路径必须在指定的值当中如果不在就报错.当用户输入的是除zhangsan lisi以外的内容就会报错
app.route(/any(zhangsan,lisi):username)
def login(username):return username
3.methods
限制用户使用请求方法
from flask import Flaskapp Flask(__name__)app.route(/,methods[GET,POST])
def login():return 首页if __name__ __main__:app.run(debugTrue,host0.0.0.0)五、请求与响应
1.请求request
请求相关的属性
url 完整的请求地址
base_url: 去掉get参数的url
host_url: 只有主机和端口号的url
path: 路由中的路径
method: 请求方法
remote_addr: 请求的客户端地址
args: get请求参数
form: post请求参数
files: 文件上传
headers 请求头
cookies: 请求中的cookie
打印参数
#这里要导入flask的request对象
from flask import Flask,requestapp Flask(__name__)app.route(/login,methods[GET,POST])
def login():print(url {}.format(request.url))print(base_url {}.format(request.base_url))print(host_url {}.format(request.host_url))print(path {}.format(request.path))print(method {}.format(request.method))return 首页if __name__ __main__:app.run(debugTrue,host0.0.0.0)在浏览器访问
http://127.0.0.1:5000/login?userzhangsanpassword123结果如下
url http://127.0.0.1:5000/login?userzhangsanpassword123
base_url http://127.0.0.1:5000/login
host_url http://127.0.0.1:5000/
path /login
method GET
1.1 获取get请求参数
from flask import Flask,requestapp Flask(__name__)app.route(/login,methods[GET,POST])
def login():#这里只打印用户传递过来的参数print(args {}.format(request.args))return 首页if __name__ __main__:app.run(debugTrue,host0.0.0.0)浏览器访问
http://127.0.0.1:5000/login?userzhangsanpassword123打印结果如下
args ImmutableMultiDict([(user, zhangsan), (password, 123)])ImmutableMultiDict这种类型叫做 “类对象”,获取类对象中的值方法有3种如下: 三种方法的区别在于 request.args[] 这种形式如果key不存在就会报错 request.args.get() 这种形式如果key不存在不会报错会返回none,所以这种用的比较多 request.args.getlist() 如果args种 有重复的key这种形式会将所有key都取出来上边两种只会取第一个
from flask import Flask,requestapp Flask(__name__)app.route(/login,methods[GET,POST])
def login():print(args {}.format(request.args))print(request.args[user])print(request.args.get(user))print(request.args.getlist(password))return 首页if __name__ __main__:app.run(debugTrue,host0.0.0.0)结果如下
args ImmutableMultiDict([(user, zhangsan), (password, 123)])
zhangsan
zhangsan
[123]1.2 post请求
flask接受post请求使用的是 request.form。
from flask import Flask,request,jsonifyapp Flask(__name__)app.route(/login,methods[GET,POST])
def login():print(post请求{}.format(request.form.get(user)))return 首页if __name__ __main__:app.run(debugTrue,host0.0.0.0)使用postman 请求 post的数据需要使用form-data类型进行提交。 如果使用json格式进行提交flask需要使用 request.json进行接收。
2.响应response
返回的数据一般有以下几种
2.1 字符串
return 字符串2.2 返回模板文件xx.html
这种使用的是前后端不分离的情况
#需要导入render_template
from flask import render_templatereturn render_template(index.html)然后在templates目录下编写index.html
2.3 返回json数据
这种情况使用的是前后端分离的情况
return jsonify(python字典)2.4 返回自定义response
def login():html render_template(index.html,namezhangsan)res Response(html)return res3.重定向
flask中重定向有两种用法 第一种
from flask import Flask,redirectapp Flask(__name__)app.route(/,methods[GET,POST])
def index():#如果用户访问根直接跳转到 login路由return redirect(/login)app.route(/login,methods[GET,POST])
def login():return h1登录页面h1if __name__ __main__:app.run(debugTrue,host0.0.0.0)第二种 url_for.以下这种方式也叫做 反向解析通过函数名找url
res url_for(蓝图名称.视图函数名称)
return redirect(res)六、会话技术cookie
cookie是客户端的会话技术 cookie的作用让服务器能够分判出 不同的http请求。应用场景一般用于登录。 产生cookie的过程
1.用户携带用户名和密码进行登录
2.服务端验证用户名和密码然后设置好cookie,和用户名和密码绑定返回给浏览器
3.浏览器会自动保存cookie到本地
4.浏览器下次在请求的时会自动带上cookie
5.取出cookie的值判别哪个用户在访问返回对应用户的数据1.cookie相关参数
1.设置cookie
response.set_cookie(key,value[,max_ageNone,expriseNone])max_age: 整数指定cookie的过期时间,单位为秒
expries: 整数指定过期时间可以指定一个具体日期时间
以上两个参数选择一个指定即可2.获取cookie
request.cookies.get(key)3.删除cookie
response.delete_cookie(key)2.cookie实例
2.1 创建templates目录
此目录存放html文件,此目录下创建login.html,home.html
2.2 login.html
!DOCTYPE html
html langen
headmeta charsetUTF-8titlelogin/title
/head
bodyform action/login methodposth1登陆页面/h1用户名input typetext nameusername idbr密emsp;码input typepassword namepassword idbrbrbutton typesubmit提交按钮/button/form/body
/html2.3 home.html
!DOCTYPE html
html langen
headmeta charsetUTF-8titlehome/title
/head
bodyh1Home页面/h1
/body
/html2.4 main.py
解释max
from flask import Flask,render_template,request,Response,redirectapp Flask(__name__)app.route(/)
app.route(/login,methods[GET,POST])
def login():if request.method GET:return render_template(login.html)elif request.method POST:username request.form.get(username)passworwd request.form.get(password)if username admin and passworwd admin:getCookie request.cookies.get(testcookie)if getCookie:return redirect(/home)else:res redirect(/home)res.set_cookie(testcookie,2024,max_age10)return reselse:return 用户名或者密码错误app.route(/home)
def home():getCookie request.cookies.get(testcookie)if getCookie 2024:return render_template(home.html)else:return redirect(/login)if __name__ __main__:app.run(debugTrue,host0.0.0.0)解释 cookie的过期时间为10秒过期后浏览器会自动删除cookie
六、会话技术-session
session是服务器端的会话技术依赖于cookie 特点 服务端的会话技术 所有数据存在服务器中 默认存储在内存中 存储结果也是key-value的形式 session 是离不开cookie
flask中的seesion是全局对象
1.常用操作
设置session session[key] value获取sessionsession.get(key,defaultNOne)删除sessionsession.pop(key)删除某一值session.clear() 清楚所有2.session和cookie的区别
cookie:1.在浏览器存储2.安全性较低3.可以减轻服务器压力
session:1.在服务器存储2.安全性高3.对服务器要求较高4.依赖cookie3.实例
3.1 增加退出功能
在home.html中增加 退出
!DOCTYPE html
html langen
headmeta charsetUTF-8titlehome/title
/head
bodyh1Home页面/h1form actionlogout methodpostbutton typesubmit注销/button/form/body
/html3.2 main.py
from flask import Flask,render_template,request,Response,redirect,session
import datetimeapp Flask(__name__)
#设置一个安全的密钥否则无法成功返回session
app.secret_key abc123#为了测试设置session的过期时间为3秒session过期后不会自动删除sessIon
app.permanent_session_lifetime datetime.timedelta(seconds3)app.route(/)
app.route(/login,methods[GET,POST])
def login():if request.method GET:return render_template(login.html)elif request.method POST:username request.form.get(username)passworwd request.form.get(password)if username admin and passworwd admin:getCookie session.get(testcookie)if getCookie:return redirect(/home)else:res redirect(/home)session[testcookie] 2024return reselse:return 用户名或者密码错误app.route(/home)
def home():getCookie session.get(testcookie)if getCookie 2024:return render_template(home.html)else:return redirect(/login)app.route(/logout,methods[POST])
def logout():session.pop(testcookie)return redirect(/login)if __name__ __main__:app.run(debugTrue,host0.0.0.0)七、文件上传request.files
1.模板文件
[rootnode-2 templates]# cat index.html
h1form action/upload methodpost enctypemultipart/form-data#这里的 name的值决定了 flask 获取上传文件的key input typefile idfileInput namefilebrbrinput typesubmit value提交/form
/h1
2.main.py
from flask import Flask,render_template,requestapp Flask(__name__)app.route(/)
def index():return render_template(index.html)app.route(/upload,methods[GET,POST])
def upload():print(request.files)print(request.files.get(file))print(request.files.get(file).filename)return upload OK!!! if __name__ __main__:app.run(debugTrue,host0.0.0.0)
上传一张图片查看日志
打印结果如下
ImmutableMultiDict([(file, FileStorage: 1.jpeg (image/jpeg))])
FileStorage: 1.jpeg (image/jpeg)
1.jpeg
2.1 查看上传对象
request.files的值为
ImmutableMultiDict([(file, FileStorage: 2.jpeg (image/jpeg))])这里的file 就是 html中 input 中的name的值
2.2 获取存储对象
request.file.get(‘file’) 的值为:
FileStorage: 2.jpeg (image/jpeg)这个值就是要存储的对象
2.3 获取上传文件名称
request.file.get(‘file’).filename 的值
1.jpeg3.保存上传文件
from flask import Flask,render_template,requestapp Flask(__name__)app.route(/)
def index():return render_template(index.html)app.route(/upload,methods[GET,POST])
def upload():save_url /root/pythonfiles request.files.get(file)if files:file_name files.filenamefiles.save({}/{}.format(save_url,file_name))return upload OK!!!else:return 上传文件不能为空!if __name__ __main__:app.run(debugTrue,host0.0.0.0)八、模板
Flask中使用Jinja2模板引擎 Jinja2是由Flask作者开发。 模板优势 速度快被广泛应用 HTML设计和后端python分离 减少python复杂度 非常灵活快速和安全 提供了控制继承等高级功能
小技巧
在pycharm中写html 输入任意标签 按tab键自动补齐标签。
1.模板语法
模板语法主要有两种
变量 和 标签
1.1.模板中的变量
语法 {{ 变量名 }} 视图传递给模板的数据 变量如果不存在默认忽略
1.2.模板中的标签
语法 {% 标签 %}| 这个标签可以是 控制逻辑外部表表达式创建变量、宏定义
2.简单实例
2.1 变量传递
视图函数中传递变量
return render_template(login.html,username”zhangsan“)html中引入变量
p姓名: {{ username }}/p2.2 复杂传递
视图中定义变量并返回
def login():data {user: zhangsan,age: 20,likes: [乒乓球,游泳,听音乐]}return render_template(login.html,**data)html中引入传入的data的值
bodyh1登录首页/h1p姓名: {{ user }}/pp年龄: {{ age }}/pp爱好: {{ likes[0] }}/p/body2.3 if判断 p姓名: {{ user }}/p{% if age 18 %}p年龄成年人/p{% else %}p年龄未成年/p{% endif %}p爱好: {{ likes[0] }}/p2.4 for循环
其中 loop.index0 写法是固定的。
bodyh1爱好/h1{% for i in likes %}h2{{ i }}/h2索引: {{ loop.index0 }}{% endfor %}
/body