网站的目录怎样做的网站建设 技术方案
网站的目录怎样做的,网站建设 技术方案,查建设工程规划许可证在哪个网站,wordpress 加载速度在此之前#xff0c;向大家说明的是#xff0c;我们整个框架用的是flask sqlalchemy redis。如果没有开发过web#xff0c;还是先去学习一下#xff0c;这边只是介绍如果从开发web转换到开发移动端。如果flask还不是很熟悉#xff0c;我建议先到这个网站简单学习一下向大家说明的是我们整个框架用的是flask sqlalchemy redis。如果没有开发过web还是先去学习一下这边只是介绍如果从开发web转换到开发移动端。如果flask还不是很熟悉我建议先到这个网站简单学习一下非常非常简单。http://dormousehole.readthedocs.org/en/latest/ 一直想写一些特别的东西能让大家学习讨论的东西。但目前网上的很多博客老么就按照官方文档照本宣读要么直接搬代码什么都不说明。我写这个系列的博客让大家由浅入深一步一步走向复杂结构以及为啥要这么走其他方式可不可以等等。 目前看来移动开发最火而我们python最适合开发移动的就是flask web框架这款web框架非常清晰可以简单用可以复杂用。最简单的时候一个py文件就可以做一个项目复杂的时候利用蓝图做各种版本控制代码结构自己完全控制非常自由。 首先我们要知道目前我们移动开发基本都在用restful api什么是restful api呢百度百科一下Web 应用程序最重要的 REST 原则是客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启客户端不会得到通知。此外无状态请求可以由任何可用服务器回答这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。 说白了我们不能使用cookie不能使用session了。如果稍微有点http经验的人都知道很多时候我们都把一些基本内容放在cookie里面服务器每次读取或者写入的时候服务器端就直接设置session就可以了这样每次客户端直接携带自己的cookie值上来我们就知道它是谁怎么把数据给它。但restful api的风格不允许这样那服务器应该采取何种方案呢 目前网上大多数做法是token方式第一次登录的时候先提交用户名密码服务器收集到以后先验证一下如果验证通过了这时候服务器端基于用户名、密码、当前时间戳等内容用md5或者des或者aes等加密方式生成一个token值然后把token值存放到redis里面记录它对应哪个用户然后把这个token值发给客户端。客户端收到token值以后下次访问服务器端任何接口的时候直接携带这个token服务器端就知道它是谁了该给它什么数据。哪以何种方式给服务器端呢通常的做法就是把token值放在header里面。当然这个不是绝对你也可以放在body里面这个都是仁者见仁智者见智的事。好了我们就先放在header头里面。 以上说了这么多大家也烦了直接上代码再解释吧。 首先创建整个工程为了最简单方便我们直接就保留以下的py文件。 看model.py里面的代码 # coding:utf-8
from sqlalchemy import create_engine, ForeignKey, Column, Integer, String, Text, DateTime,\and_, or_, SmallInteger, Float, DECIMAL, desc, asc, Table, join, event
from sqlalchemy.orm import relationship, backref, sessionmaker, scoped_session, aliased, mapper
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
from sqlalchemy.orm.collections import attribute_mapped_collection
import datetimeengine create_engine(mysql://root:a12345678127.0.0.1:3306/blog01?charsetutf8, pool_recycle7200)Base declarative_base()db_session scoped_session(sessionmaker(autocommitFalse,autoflushFalse,bindengine))Base.query db_session.query_property()class User(Base):__tablename__ userid Column(id, Integer, primary_keyTrue)phone_number Column(phone_number, String(11), indexTrue)password Column(password, String(30))nickname Column(nickname, String(30), indexTrue, nullableTrue)register_time Column(register_time, DateTime, indexTrue, defaultdatetime.datetime.now)if __name__ __main__:Base.metadata.create_all(engine) 运行一下就创建user表了。 user表中有电话号码phone_number密码password昵称nicknameregister_time注册时间 下面是view.py代码 1 # coding:utf-82 from flask import Flask, request, jsonify3 from model import User, db_session4 import hashlib5 import time6 import redis7 8 app Flask(__name__)9 redis_store redis.Redis(hostlocalhost, port6380, db4, passworddahai123)
10
11
12 app.route(/)
13 def hello_world():
14 return Hello World!
15
16
17 app.route(/login, methods[POST])
18 def login():
19 phone_number request.get_json().get(phone_number)
20 password request.get_json().get(password)
21 user User.query.filter_by(phone_numberphone_number).first()
22 if not user:
23 return jsonify({code: 0, message: 没有此用户})
24
25 if user.password ! password:
26 return jsonify({code: 0, message: 密码错误})
27
28 m hashlib.md5()
29 m.update(phone_number)
30 m.update(password)
31 m.update(str(int(time.time())))
32 token m.hexdigest()
33
34 redis_store.hmset(user:%s % user.phone_number, {token: token, nickname: user.nickname, app_online: 1})
35 redis_store.set(token:%s % token, user.phone_number)
36 redis_store.expire(token:%s % token, 3600*24*30)
37
38 return jsonify({code: 1, message: 成功登录, nickname: user.nickname, token: token})
39
40
41 app.route(/user)
42 def user():
43 token request.headers.get(token)
44 if not token:
45 return jsonify({code: 0, message: 需要验证})
46 phone_number redis_store.get(token:%s % token)
47 if not phone_number or token ! redis_store.hget(user:%s % phone_number, token):
48 return jsonify({code: 2, message: 验证信息错误})
49
50 nickname redis_store.hget(user:%s % phone_number, nickname)
51 return jsonify({code: 1, nickname: nickname, phone_number: phone_number})
52
53
54 app.route(/logout)
55 def logout():
56 token request.headers.get(token)
57 if not token:
58 return jsonify({code: 0, message: 需要验证})
59 phone_number redis_store.get(token:%s % token)
60 if not phone_number or token ! redis_store.hget(user:%s % phone_number, token):
61 return jsonify({code: 2, message: 验证信息错误})
62
63 redis_store.delete(token:%s % token)
64 redis_store.hmset(user:%s % phone_number, {app_online: 0})
65 return jsonify({code: 1, message: 成功注销})
66
67
68 app.teardown_request
69 def handle_teardown_request(exception):
70 db_session.remove()
71
72 if __name__ __main__:
73 app.run(debugTrue, host0.0.0.0, port5001) 下面来逐个解释一下 首先几个import不用解释了注意把User和db_session 都import过来然后定义一个redis的connection。 再接下来就login接口直接post方法获取json格式数据里面有phone_number和password接下来数据库查询如果没有这个用户返回一个json格式再接下来对比password如果phone_number和password都正确就用md5函数生成一个token这个token包含由phone_number、password、当前时间戳str(int(time.time()))生成再返回。 看我每个返回的东西首先都是json格式这个是目前大多数移动开发默认返回的格式其次每个返回必定有个code目前这边有2个值是0和1其实可以看出来0代表失败1代表成功有0的地方必定要有message。每个返回一个code是必须的但是值可以自己定义。很多开发把http的code直接拿来用也可以比如成功返回就200没有就404禁止就403。这些都可以只要服务器端开发和客户端开发开始就约定一个值就好具体的值只要能快速开发都可以。 好了返回格式先解释到这我们以后会继续扩展。再看接下来的redis。 第一行先用 user:13765505223 这种类型的作为每个用户的key值是一些基本的东西其中app_online代表上线了这个app_online其实很重要的因为移动端开发跟web不同要记录移动端在登录状态还是登出状态。如果在登录状态我们就可以从服务器推送了关于推送我们以后会逐步讲这个先放在这边。 第二行用token:token 作为keykey里面的值是具体的用户电话号码 第三行把这个token设置一个过期时间超过这个时间就删除这个有需要的app可以设置一下。如果你的app的token想永远不变这行代码可以注释掉。 好了目前login函数基本完成。 接下来看验证函数user和注销函数logout user这个函数这是来验证登录以后有没有数据没多少意义。 逐行分析首先在header里找到这个token如果没有token就返回失败其次验证redis如果token所在的key value对里面没有值或者值错误则返回失败。然后返回具体的数据。非常简单的一个函数。 下面的logout函数也差不多也是这样也是验证然后删除token的key value对再设置app_online为0表示当前是注销状态。 最后一个很重要这边一定要记住把这个函数写上。如果没有这个函数每一个会话以后db_session都不会清除很多时候数据库改变了前台找不到或者明明已经提交数据库还是没有更改或者长时间没有访问接口mysql gong away这样的错误。总之一定要加上。 好了整个过程已经完成下面进入验证状态。首先我们在外面新建一个用户存到数据库然后写个小脚本验证一下。 from model import User, db_sessionnew_user User(phone_number12345678901, password123456, nicknameu测试用户1)db_session.add(new_user)db_session.commit() 一个用户已经创建好接下来就是测试这边测试有2种方式一个用IDE自带的测试软件测试pycharm有很好的测试软件其次用小脚本方式测试既然我们以后要不停的写例子就用小脚本测试吧过程也非常简单。 1 # coding:utf-82 import requests3 import json4 5 6 class APITest(object):7 def __init__(self, base_url):8 self.base_url base_url9 self.headers {}
10 self.token None
11
12 def login(self, phone_number, password, path/login):
13 payload {phone_number: phone_number, password: password}
14 self.headers {content-type: application/json}
15 response requests.post(urlself.base_url path, datajson.dumps(payload), headersself.headers)
16 response_data json.loads(response.content)
17 self.token response_data.get(token)
18 return response_data
19
20 def user(self, path/user):
21 self.headers {token: self.token}
22 response requests.get(urlself.base_url path, headersself.headers)
23 response_data json.loads(response.content)
24 return response_data
25
26 def logout(self, path/logout):
27 self.headers {token: self.token}
28 response requests.get(urlself.base_url path, headersself.headers)
29 response_data json.loads(response.content)
30 return response_data 写一个很简单的小脚本就可以拉到命令行测试了我们试试吧。 from client import APITestapi APITest(http://127.0.0.1:5001)data api.login(12345678901, 1234567)print data.get(message)
密码错误data api.login(12345678901, 123456)print data.get(message)
成功登录data api.user()print data
{uphone_number: u12345678901, ucode: 1, unickname: u\u6d4b\u8bd5\u7528\u62371}print nickname
Traceback (most recent call last):File input, line 1, in module
NameError: name nickname is not definedprint data.get(nickname)
测试用户1data api.logout()print data
{umessage: u\u6210\u529f\u6ce8\u9500, ucode: 1}print message
Traceback (most recent call last):File input, line 1, in module
NameError: name message is not definedprint data.get(message)
成功注销 登录成功的时候我们进redis看看redis数据格式比较直观点。 127.0.0.1:6380[4] keys *
1) token:bbf73ab651a13a5bc5601cf01add2564
2) user:12345678901
127.0.0.1:6380[4] hgetall user:12345678901
1) token
2) bbf73ab651a13a5bc5601cf01add2564
3) nickname
4) \xe6\xb5\x8b\xe8\xaf\x95\xe7\x94\xa8\xe6\x88\xb71
5) app_online
6) 1
127.0.0.1:6380[4] get token:bbf73ab651a13a5bc5601cf01add2564
12345678901
127.0.0.1:6380[4] 嗯一切都正常但我们开发不能一切正常就满足。就这些代码我们有很多需要改进的地方尤其是验证token的那边是不是可以改进呢redis设置的时候一连串动作如果这时候出错或者redis只设置到一半怎么办这些问题我们下一章继续解决。转载于:https://www.cnblogs.com/yueerwanwan0204/p/5327912.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89371.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!