设为首页 收藏本站
查看: 1215|回复: 0

[经验分享] 我的python学习--第七、八天

[复制链接]

尚未签到

发表于 2018-8-9 09:57:08 | 显示全部楼层 |阅读模式
  Flask的HTTP方法
  HTTP(与web应用会话的协议)有许多不同的URL方法。默认情况下,路由只回应GET请求,但是通过route()装饰器传递methods参数可以改变这个行为。
  HTTP方法告知服务器,客户端想对请求的页面 做些什么。下面的是最常见的方法:
  get:常用与获取数据,读,浏览器访问都是get请求
  post:写数据,浏览器默认是不支持直接post方式,一般通过变动设置 method="post"实现, 优点:表单数据会以   加密的形式传到逻辑端
  而get会把提交的数据在浏览器显示
  *前端get请求,逻辑端通过request.args.get获取参数
  *前端post请求,逻辑端通过request.form.get获取数据
  flask.request常用参数
  method:匹配当前请求方法,例如POST,GET等等
  form:一个包含解析过的,从POST或PUT请求发送的表单对象MultiDict。请注意,上传的文件不会再这里,而是在files属性中
  args:一个包含解析过的查询字符串(URL中问号后的部分)内容的MutliDict
  request.args.has_key('key'):查看是否有值传入
  json:如果文件类型是application/json,它将包含解析过的json数据
  request.json.get('age'):获取json方式传来的'age'的值
  request.get_json():获取json方式传来的值
  headers:将传入的请求的headers存为一个类似字典的对象
  cookies:一个包含请求中传送的所以cookie内容的字典
  数据端代码优化
  一、mysql单条数据查询
>>> import MySQLdb as mysql  
>>> conn  = mysql.connect(host='localhost',user='root',passwd='123456',db='reboot')
  
>>> cur = conn.cursor()
  
>>> fields = ['name','name_cn','password','email','mobile','role','status'] # 要查询字段
  
>>> where = {'name':'admin'}                                                # 获取查询关键字
  
>>> contion = 'name = "%(name)s"'%where
  
>>> sql = 'select %s from users where %s'%(','.join(fields),contion)        # 构建查询语句
  
>>> cur.execute(sql)
  
1L
  
>>> res = cur.fetchone()                                                    # 查询一条数据
  
>>> res                                                                     # 为一层元祖
  
('admin', 'admin', '123456', 'admin@123.com', '12312312', 'admin', '0')
  
>>> user = {}
  
>>> for i,k in enumerate(fields):                                           # (1)*根据enumerate函数,生成字典
  
...     user[k] = res
  
...
  
>>> user
  
{'status': '0', 'name': 'admin', 'mobile': '12312312', 'name_cn': 'admin',, 'role': 'admin', 'password': '123456', 'email': 'admin@123.com'}
  
>>> result = [dict((k,res) for i,k in enumerate(fields))]                # (2)*更方便的写法
  二、mysql多条数据查询
>>> import MySQLdb as mysql  
>>> conn  = mysql.connect(host='localhost',user='root',passwd='123456',db='reboot')
  
>>> cur = conn.cursor()
  
>>> fields = ['name','name_cn','password','email','mobile','role','status'] # 要查询字段
  
>>> sql = 'select %s from users'%(','.join(fields))                         # 查询全部
  
>>> cur.execute(sql)
  
3L
  
>>> res = cur.fetchall()                                                    # 查询多条数据
  
>>> res                                                                     # 结果为一个嵌套元祖
  
(('admin', 'admin', '123456', 'admin@123.com', '12312312', 'admin', '0'), ('test', 'test', '123', '123@qq.com', '12312312312', 'admin', '0'), ('test2', 'test2', '123123', '123@qq.com', '11111111111', 'admin', '0'))
  
>>> result = [dict((k,row) for i,k in enumerate(fields)) for row in res] # *使用enumerate函数和字典生成式
  
>>> result
  
[{'status': '0', 'name': 'admin', 'mobile': '12312312', 'name_cn': 'admin', 'role': 'admin', 'password': '123456', 'email': 'admin@123.com'}, {'status': '0', 'name': 'test', 'mobile': '12312312312', 'name_cn': 'test', 'role': 'admin', 'password': '123', 'email': '123@qq.com'}, {'status': '0', 'name': 'test2', 'mobile': '11111111111', 'name_cn': 'test2', 'role': 'admin', 'password': '123123', 'email': '123@qq.com'}]
  三、mysql数据插入
>>> import MySQLdb as mysql  
>>> conn  = mysql.connect(host='localhost',user='root',passwd='123456',db='reboot')
  
>>> cur = conn.cursor()
  
>>> fields = ['name','name_cn','email','role']                               # 要插入字段
  
# (1)*优化写法,data为前端获取的数据,字典格式,生产环境建议使用
  
>>> sql = 'insert into users (%s) values (%s)"%(','.join(fields),','.join(['"%s"'%data[k] for k in fields]))
  
>>> sql
  
'insert into users (name,name_cn,email,role) values ("test1","test1","test1@qq.com","0")'
  
>>> fields,values = [],[]
  
>>> for k,v in data.items():                                                 # (2)*k,v生成两个列表
  
...     fields.append(k)
  
...     values.append("'%s'"%v)
  
...
  
>>> fields
  
['name','name_cn','email','role']
  
>>> values
  
["'test1'","'test1'","'test1@qq.com'","'0'"]
  
>>> sql = 'insert into users (%s) values (%s)"%(','.join(fields),','.join(values)) # 使用k,v列表直接写入sql
  
>>> sql
  
'insert into users (name,name_cn,email,role) values ("test1","test1","test1@qq.com","0")'
  注意:
  1:如果sql语句中没有引号,最外围单双引号都可以
  2:如果sql语句里面有引号,最好外面单引号,里面双引号
  获取表单值得方法
  1、request.form:一次性获取前端表单的所有值;dict(request.form)格式为{k1:[v1],k2:[v2],...}
  2、request.form.get('name',None):获取前端固定值,如'name',如果获取不到,返回None;None为默认值,可省略
  3、request.form['name']:获取前端固定值,如'name',如果获取不到,返回400错误
  4、request.form.getlist['key']:获取前端固定值,如'key',当将多个值传给key时使用,如复选框获取的数据
  session
  session可以理解为一个全局字典,它允许你在不同请求间存储特定用户的信息。它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名。这意味着用户可以查看你Cookie 的内容,但却不能修改它,除非用户知道签名的密钥。
  把用户的所有信息都存为session的一条记录,可以在任何场景下使用get获取,在每个增删查改的操作前,通过查看session中是否有记录来判断用户是否已经登录,没有登录则跳转到登录页面
from flask import Flask,request,render_template,redirect,session       # 引入session  
import MySQLdb as mysql
  

  
conn=mysql.connect(user='root',host='127.0.0.1',passwd='123456',db='reboot',charset='utf8')
  
conn.autocommit(True)
  
cur = conn.cursor()
  

  

  
app = Flask(__name__)
  
app.secret_key = 'zYpRh/QxW3c='                                        # 可使用os.urandom()来生成
  

  
@app.route('/login',methods=['GET','POST'])
  
def login():
  
    if request.method == 'POST':
  
        data = dict((k,v[0]) for k,v in dict(request.form).items())
  
    #   data = {k:v[0] for k,v in dict(request.form).items()}
  
        if not data.get('name',None) or not data.get('password',None):
  
            errmsg = 'name or password not null'
  
            return render_template('login.html',result = errmsg)
  

  
        fields = ['name','password']
  
        sql = 'select %s from users where name="%s"'%(','.join(fields),data['name'])
  
        cur.execute(sql)
  
        res = cur.fetchone()
  
        if not res:
  
            errmsg = '%s is not exist'%data['name']
  
            return render_template('login.html',result = errmsg)
  
        user = {}
  
        user = dict((k,res) for i,k in enumerate(fields))
  
        if user['password'] != data['password']:
  
            errmsg = 'password is wrong'
  
            return render_template('login.html',result = errmsg)
  
        else:
  
            session['name'] = data['name']                            # 将name记录到session中,生成session
  
            return redirect('/userlist')
  
    else:
  
        return render_template('login.html')
  

  
@app.route('/loginout')
  
def loginout():
  
    session.pop('name')                                               # 删除session中的name
  
    return redirect('/login')
  通过谷歌浏览器查看session
DSC0000.png

  MVC思想
  MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入(前端)、处理(逻辑端)和输出(数据端)功能在一个逻辑的图形化用户界面的结构中。
  以登录模块为例 总结MVC思想
  一:前端
  1.登录页面首次登录默认get方式,返回一个待填写的表单
  2.输入用户名密码后,点击表单按钮以post方式向逻辑端发起请求,并把表单数据传给逻辑端
  二:逻辑端
  3.逻辑端判断前端发起的是post表单提交还是get方式。如果get请求,说明是第一次发起,返回对应的html页面即可;如果是POST请求,说明是提交了表单数据,通过request.form获取表单数据
  4.逻辑端查询数据库,判断前端传来的表单数据是否在数据库中存在,如果存在,表示登录成功,生成session,将用户需要的信息存入session。如果不存在,则跳转到登录页面,重新输入账号密码
  三:数据端
  5.对数据库的增删改查,并返回结果
  jQuery学习
  jQuery是一个兼容多浏览器的javascript库。
  一个小例子:
<script src='/usr/src/jquery.min.js'></script>                # 在head中添加此处代码  
<script>
  
alert('welcome to jquery')
  
</script>
  效果如下:
DSC0001.png

  具体可以通过http://www.w3school.com.cn/jquery/index.asp进行学习

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549001-1-1.html 上篇帖子: python 实现将字典写入csv文件 下篇帖子: Python [1] 基础理论概述
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表