python(十一)接口开发、写日志、发邮件、python来发请求、手动添加环境变量
接口开发
接口开发需要用到第三方模块flask.
1、登录的接口。
import flask
import json
import pymysql
import hashlib
server = flask.Flask(__name__)
#新建一个服务,把当前这个python文件当做一个服务
def my_db(sql):
conn = pymysql.connect(host='XX.XXX.XX.XX',user='XXX',password='XXXXXX',
db='XXX',port=3306,charset='utf8',autocommit=True)
cur = conn.cursor(pymysql.cursors.DictCursor)
cur.execute(sql)
res = cur.fetchone()
cur.close()
conn.close()
return res
def my_md5(s,salt=''):
s = s+salt
news = str(s).encode()
m = hashlib.md5(news)
return m.hexdigest()
@server.route('/login',methods=['get'])
def hello():
uname = flask.request.values.get('username')
pd = flask.request.values.get('passwd')
sql = 'select * from su_user where login_name="%s"'%uname
res = my_db(sql)
print(res)
if res:
if my_md5(pd) == res.get('pwd'):
res = {"code":0,"msg":"登录成功!"}
else:
res = {"code":1,"msg":"密码错误!"}
else:
res = {'code':2,"msg":"用户不存在"}
return json.dumps(res,ensure_ascii=False,indent=4)
#别人访问时,需要输入我自己的IP地址作为url中的IP,端口号为8999,这样别人也能访问我开发的接口;
#debug=True:代表修改完代码后不需要手动重启服务,直接就自动重启了
server.run(host='0.0.0.0',port=8999,debug=True)
#server.run()
2、入参不同的接口
import flask
import tools
import json,redis
@server.route('/api/stu')
def get_stu():
username = flask.request.values.get('name')#默认get不到的话,返回的值就是None
age = flask.request.values.get('age')
if username and age:
sql = "select * from app_student where name='%s' and age='%s'" % (username, age)
elif not username and age:
sql = "select * from app_student where age='%s'" % age
elif username and not age:
sql = "select * from app_student where name='%s'" % username
else:
sql = "select * from app_student"
res = tools.my_db2(sql)
return json.dumps(res,ensure_ascii=False,indent=4)
server.run(host='0.0.0.0',port=8999,debug=True)
3、入参是json类型的
@server.route('/api/add_stu',methods=['post'])
def add_stu():
if flask.request.is_json:#判断入参是否是json类型的
session_id = flask.request.json.get('session_id')
name= flask.request.json.get('name')
phone = flask.request.json.get('phone')
grade = flask.request.json.get('grade')
addr = flask.request.json.get('addr','北京')
sex = flask.request.json.get('sex','男')
age = flask.request.json.get('age',18)
gold = flask.request.json.get('gold',1000)
if session_id and name and phone and grade:
login_tag , data = check_session(session_id)
if login_tag:
insert_sql="insert into `jxz`.`app_student` ( `name`, `sex`," \
" `age`, `addr`, `grade`, `phone`, `gold`)" \
" values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s');"%(name,sex,age,addr,grade,phone,gold)
tools.my_db(insert_sql)
res = {'code':0,'msg':'学生信息添加成功'}
else:
res = data
else:
res = {'code':3,'msg':'必填参数未填,请查看接口文档!'}
else:
res = {'code':5,'msg':'入参是json类型的!'}
return json.dumps(res, ensure_ascii=False)
4、入参是上传文件类型的
@server.route('/api/upload',methods=['post'])
def upload():
session_id = flask.request.values.get('session_id')
file = flask.request.files.get('file_name')
if session_id and file:
login_tag, data = check_session(session_id)
if login_tag:
new_file_name = '%s_%s'%(int(time.time()),file.filename)#file.filename能获取到上传的文件名
#防止文件名重复,所以把文件名前面加上了时间戳
abs_file_path = os.path.join(setting.UPLOAD_DIR,new_file_name)
#拼文件的绝对路径,这样子就放到了uploads目录下
file.save(abs_file_path)#保存文件
res = {'code':0,'msg':'上传文件成功!'}
else:
res = data
else:
res = {'code':3,'msg':'必填参数未填,请查看接口文档!'}
return json.dumps(res, ensure_ascii=False)
3、搭建框架思想
例如:图书管理系统
写日志
1、pip install nnlog
import nnlog
#nnlog.Logger.words='哈哈哈哈'
#默认打印debug级别的日志,默认when='D'表示每天产生日志,默认backCount=5代表保留最近5天的日志
#自动生成book_server.log文件,并且里面永远存最新的日志
log = nnlog.Logger('book_server.log',when='S',backCount=3)
# debug#最低级日志
# info倒数第二级
# warning整数第二级
# error#最高级日志
#log.surprise()
log.debug('xxx值是什么')
log.info('调用了什么xxx')
log.warning('xx警告!')
log.error('xxx出错!')
注意:默认是打印debug级别,那么会把debug、info、warning、error级别的日志都打印出来
如果指定打印是warning级别,那么会把warning和info级别的日志打印出来。
总结:会把指定的级别和比它自己高级别的日志打印出来。
发邮件
1、导入yagmail模块,导入的模块不可以直接“pip install yagmail”,因为发送中文附件时,会报乱码,所以需要导入.whl形式结尾的文件
需要手动安装:pip install +文件绝对路径 (pip install E:\python20181026\yagmail-0.10.212-py2.py3-none-any.whl)
2、需要知道发送邮箱的号码,与邮箱的授权码(不是邮箱登录密码),
代码如下:
import yagmail
username='xxxxx@163.com'
password='XXXXXXXX'#生成授权码,qq、163、126都是授权码
mail_server = 'smtp.163.com'
# mail_server = 'smtp.qq.com'
# mail_server = 'smtp.126.com'
m = yagmail.SMTP(user=username,password=password,host=mail_server)
# smtp_ssl=True,如果邮箱使用了安全协议,就需要加这个
#qq邮箱就是使用了安全协议
to = ['1xxx722@qq.com','wangxxx416516@163.com','51xx5@qq.com']
cc = ['6137xx17@qq.com','11xx42722@qq.com','136xx4@qq.com']
#to:收件人; cc:抄送;subject:主题;contents:内容;attachments:附件
m.send(to=to,cc=cc,subject='今天吃了吗',
contents='今天吃鱼肉了吗,吃饱没',
attachments=r'tools.py')
发送网络请求
需要导入requests模块 pip install requests
1、发送get请求
import requests
import random
url='http://127.0.0.1:8999/api/upload'
data = {'username':'testuser1','passwd':'111111'}
r = requests.get(url,params=data) #发get请求
r.json()#如果你请求的是一个接口的话,返回的是json,那就给你转成字典
r.text()#返回的是字符串
2、发送post请求
import requests
import random
url='http://127.0.0.1:8999/api/upload'
data = {'username':'testuser1','passwd':'111111'}
r = requests.post(url,data=data) #发post请求
3、入参是json类型的
import requests
import random
url='http://127.0.0.1:8999/api/upload'
r = requests.post(url,data=data) #发post请求
data = {
"session_id":"6ab8785039dcf50fb11c53acc1db7648",
"name":"zhouyongbo%s"%random.randint(1,99),
"phone":"111211345%02d"%random.randint(1,99),
"grade":"天秤座"
}
r = requests.post(url,json=data) #入参是json类型的
4、上传文件
r = requests.post(url,
data={'session_id':'6ab8785039dcf50fb11c53acc1db7648'},
files={'file_name':open('account.xls','rb') }
)
5、请求中带有cookie的
requests.get(url,headers={'cookie':'hdfjghdkghkdhgkdh'})
requests.get(url,cookies={'pt2ggui':'o0511402865','RK':'JQZpwBp1by'}) (使用不方便,很少用)
6、下载文件
url='https://qiniuuwmp3.changba.com/1127063572.mp4'
r = requests.get(url)
f = open('sdfsdf.mp4','wb')
f.write(r.content) #r.content #二进制,下载图片、下载文件的时候用
f.close()
手动添加环境变量
import sys,os
#手动加入环境变量的,这样的话,在其他人的电脑上运行就没有问题了
BASE_PATH=os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0,BASE_PATH)