一、原生文件上传
form.html
1
2
3
4
5
|
< img src = "{{ url_for('static',filename='img/17.jpg') }}" width = "300" alt = "" >
< form action = "" method = "post" enctype = "multipart/form-data" >
< p >修改头像 < input type = "file" name = "file" ></ p >
< p >< input type = "submit" value = "提交" ></ p >
</ form >
|
manage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#文件上传的视图函数
@app .route( '/upload/' ,methods = [ 'GET' , 'POST' ])
def icon():
img_name = None
if request.method = = 'POST' and 'file' in request.files:
# return '有文件上传了'
file = request.files.get( 'file' )
filename = file .filename #拿到文件名称
#图片上传保存的路径
imgPath = os.path.join(os.getcwd(), 'static/upload/' + filename)
file .save(imgPath)
img_name = filename
return render_template( 'user/change_icon.html' ,img_name = img_name)
|
使用wtf和bootstrap渲染文件上传
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
from flask_script import Manager
from flask_wtf import FlaskForm
from flask_wtf. file import FileField,FileAllowed,FileRequired
from wtforms import SubmitField
from flask_uploads import UploadSet,patch_request_class,configure_uploads,IMAGES
from flask_bootstrap import Bootstrap
import os
from PIL import Image
app = Flask(__name__)
app.config[ 'MAX_CONTENT_LENGTH' ] = 1024 * 1024 * 64
app.config[ 'SECRET_KEY' ] = 'abcdef'
app.config[ 'UPLOADED_PHOTOS_DEST' ] = os.path.join(os.getcwd(), 'static/upload' )
bootstrap = Bootstrap(app)
file = UploadSet( 'photos' ,IMAGES)
configure_uploads(app, file )
patch_request_class(app,size = None )
manager = Manager(app)
#自定义一个文件上传的表单类
class File (FlaskForm):
photos = FileField( '修改头像' ,validators = [FileRequired(message = '文件不能为空' ),FileAllowed( file ,message = '该文件类型不允许上传' )])
submit = SubmitField( '提交' )
@app .route( '/' )
def index():
return render_template( 'index.html' )
#生成随机的图片名称
def random_name(suffix,length = 32 ):
import string,random
myStr = string.ascii_letters + '0123456789'
return ''.join(random.choice(myStr) for i in range (length)) + suffix
@app .route( '/upload/' ,methods = [ 'GET' , 'POST' ])
def icon():
form = File ()
img_url = None
if form.validate_on_submit():
data = request.files.get( 'photos' )
suffix = os.path.splitext(data.filename)[ - 1 ]
newName = random_name(suffix)
file .save(data,name = newName)
img_url = file .url(newName)
img = Image. open (os.path.join(app.config[ 'UPLOADED_PHOTOS_DEST' ],newName))
print (img.size) # 获取图片大小
# 设置尺寸
img.thumbnail(( 128 , 128 )) # 当前缩放不是等比缩放 变成等比缩放
img.save(os.path.join(app.config[ 'UPLOADED_PHOTOS_DEST' ], 's_' + newName))
return render_template( 'user/wtf-uplods.html' ,form = form,img_url = img_url)
if __name__ = = '__main__' :
manager.run()
|
模板中的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
from flask import Flask,render_template,request
from flask_script import Manager
from flask_wtf import FlaskForm
from flask_wtf. file import FileField,FileAllowed,FileRequired
from wtforms import SubmitField
from flask_uploads import UploadSet,patch_request_class,configure_uploads,IMAGES
from flask_bootstrap import Bootstrap
import os
from PIL import Image
app = Flask(__name__)
app.config[ 'MAX_CONTENT_LENGTH' ] = 1024 * 1024 * 64
app.config[ 'SECRET_KEY' ] = 'abcdef'
app.config[ 'UPLOADED_PHOTOS_DEST' ] = os.path.join(os.getcwd(), 'static/upload' )
bootstrap = Bootstrap(app)
file = UploadSet( 'photos' ,IMAGES)
configure_uploads(app, file )
patch_request_class(app,size = None )
manager = Manager(app)
#自定义一个文件上传的表单类
class File (FlaskForm):
photos = FileField( '修改头像' ,validators = [FileRequired(message = '文件不能为空' ),FileAllowed( file ,message = '该文件类型不允许上传' )])
submit = SubmitField( '提交' )
@app .route( '/' )
def index():
return render_template( 'index.html' )
#生成随机的图片名称
def random_name(suffix,length = 32 ):
import string,random
myStr = string.ascii_letters + '0123456789'
return ''.join(random.choice(myStr) for i in range (length)) + suffix
@app .route( '/upload/' ,methods = [ 'GET' , 'POST' ])
def icon():
form = File ()
img_url = None
if form.validate_on_submit():
data = request.files.get( 'photos' )
suffix = os.path.splitext(data.filename)[ - 1 ]
newName = random_name(suffix)
file .save(data,name = newName)
img_url = file .url(newName)
img = Image. open (os.path.join(app.config[ 'UPLOADED_PHOTOS_DEST' ],newName))
print (img.size) # 获取图片大小
# 设置尺寸
img.thumbnail(( 128 , 128 )) # 当前缩放不是等比缩放 变成等比缩放
img.save(os.path.join(app.config[ 'UPLOADED_PHOTOS_DEST' ], 's_' + newName))
return render_template( 'user/wtf-uplods.html' ,form = form,img_url = img_url)
if __name__ = = '__main__' :
manager.run()
|
二、发送邮件 flask-mail
1
|
pip install flask - mail
|
设置临时环境变量
windows set 名=值
Ubuntu下 export 名=值
注意: 名和值都不用加引号
单线程发送邮件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
from flask import Flask,render_template
from flask_script import Manager
from flask_mail import Mail,Message
import os
app = Flask(__name__)
app.config[ 'MAIL_SERVER' ] = 'smtp.163.com'
# 为了保密 将邮箱账号和授权码都加入到了临时环境变量中
app.config[ 'MAIL_USERNAME' ] = os.environ.get( 'MAIL_USERNAME' )
app.config[ 'MAIL_PASSWORD' ] = os.environ.get( 'MAIL_PASSWORD' )
mail = Mail(app)
manager = Manager(app)
@app .route( '/send_mail/' )
def send_mail():
msg = Message(subject = '大郎' ,recipients = [ '793390457@qq.com' ],sender = app.config[ 'MAIL_USERNAME' ])
msg.html = render_template( 'email/activate.html' ,username = '大郎' )
mail.send(message = msg)
return '发送邮件'
if __name__ = = '__main__' :
manager.run()
|
异步发送邮件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
from flask import Flask,render_template
from flask_script import Manager
from flask_mail import Mail,Message
import os
from threading import Thread
app = Flask(__name__)
app.config[ 'MAIL_SERVER' ] = 'smtp.163.com'
app.config[ 'MAIL_USERNAME' ] = os.environ.get( 'MAIL_USERNAME' )
app.config[ 'MAIL_PASSWORD' ] = os.environ.get( 'MAIL_PASSWORD' )
mail = Mail(app)
manager = Manager(app)
@app .route( '/send_mail/' )
def send_mail():
msg = Message(subject = '大郎' ,recipients = [ '793390457@qq.com' ],sender = app.config[ 'MAIL_USERNAME' ])
msg.html = render_template( 'email/activate.html' ,username = '大郎' )
thr = Thread(target = async_send_mail,args = (msg,)) #创建线程 参数1为创建子线程 参数2为传递参数 类型为元组
thr.start() #开启线程
return '发送邮件'
def async_send_mail(msg):
#开启程序上下文 把当前请求 作为同一个请求
with app.app_context():
mail.send(message = msg)
if __name__ = = '__main__' :
manager.run()
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000015240818