#23 楼 @ruby_sky 我是用 rails4,加了了 actionpack-xml_parser gem,验证的 URL 填写的是http://example.com/weixin/show 验证通过,但是发消息都是走 POST http://example.com/weixin/showURL改为,肯定错误,随后我把验证 http://example.com/weixin/create ,通过,但是问题是没 POST,为什么会有两个 URL 微信不通常都说一个吗?谢谢。
write myself
我通常是 api 用 grape,单独文件夹,然后就是所有模块公用 model,只在 controller 和 view 里面分,例如 admin/ 和 site/ 分别表示后台和网站。
http://git-scm.com/book/zh 只需花两个小时读完前四章,完美解答。不谢
这无可厚非啊,难道你要细力度控制到 id?我的控制是小型应用就到类,例如 User,再细一点到方法,例如 del 和 create 的权限不一样的,特别的 id 单独写,没有遇到过这么细力度的。
楼主具体说说哪些不清楚,如果不是科班出生,我觉得两个月在 linux 下搭好开发环境就不错了。还有一点就是入门之后进步会很快,当然后面还会遇到卡顿,都是难免的。慢慢来吧。我看过的书籍有《ruby 编程语言》和《ruby 元编程》都是好书,其他英语的我通常只看代码。从来不写测试!!!哈哈。ruby 我通常用来做 web 开发。感觉挺快。用 rails 我也有许多不清楚,因为他很多配置都是使用的最佳实践,没有给新手透明化。所以我通常是遇到问题 google,不会就发帖,通常都能够解决了。另外 ruby 可能用作管理工具多点,其他没发现了。还有一点是楼主决定做哪一块,如果不做 web 敏捷开发,我觉得接触 ruby 没什么意思,毕竟小众。开发安卓就用 java,ndk 就算了,官方都说兼容差。职业开发 ios,我想楼主的大洋,应该暂时不行。底层的就去 c 和 c++ 吧。祝大家七夕快乐。
腾讯的吧,比阿里便宜。用过
聊天类软件大多使用该协议,也有的基于他来修改。可以关注 openfire 服务器 (java 的),在安卓端也有成熟的开发库 smack,如果是桌面端就是 openfire+spark,另外,他有许多插件 (例如视屏聊天等),而且开源。
叫我怎么右键保存图片啊!!!
也可能是楼主的 puma 服务器的设置,例如 tomcat 的 post 限制一般为 2M,get 的限制一般视浏览器来定。
jruby 伪装 java,哈哈
为什么一定要两个域名呢?我通常是加 admin namespace,以下我没试过,不知道行不行。 1.配置两个 server,然后跳转
server {
listen 80;
server_name admin.com;
return 301 http://site.com/$request_uri;
}
server {
listen 80;
server_name site.com;
root /var/www/web;
}
2.配置 rewrite,但是在同一个 server 中
server {
listen 80;
server_name admin.com site.com;
root /var/www/web;
if ($http_host == "admin.com") {
rewrite ^/(.*)$ http://site.com/$1 permanent;
}
}
#3 楼 @xieyu33333 在中国不小众吧!!!
live 绑定也可以。
#6 楼 @assyer 感觉 ruby-china 的做法还不够,没有过期时间限制。
module RubyChina
module APIHelpers
def warden
env['warden']
end
# topic helpers
def max_page_size
100
end
def default_page_size
15
end
def page_size
size = params[:size].to_i
[size.zero? ? default_page_size : size, max_page_size].min
end
# user helpers
def current_user
token = params[:token] || oauth_token
@current_user ||= User.where(private_token: token).first
end
def oauth_token
# 此处的是为 ruby-china-for-ios 的 token Auth 特别设计的,不是所谓的 OAuth
# 由于 NSRails 没有特别提供独立的 token 参数, 所以直接用 OAuth 那个参数来代替
token = env['HTTP_AUTHORIZATION'] || ""
token.split(" ").last
end
def authenticate!
error!({ "error" => "401 Unauthorized" }, 401) unless current_user
end
end
end
class SessionsController < Devise::SessionsController
def new
super
session['user_return_to'] = request.referrer
end
def create
resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#new")
set_flash_message(:notice, :signed_in) if is_navigational_format?
sign_in(resource_name, resource)
resource.ensure_private_token!
respond_to do |format|
format.html { redirect_to after_sign_in_path_for(resource) }
format.json { render status: '201', json: resource.as_json(only: [:login, :email, :private_token]) }
end
end
end
# 重新生成 Private Token
def update_private_token
random_key = "#{SecureRandom.hex(10)}:#{self.id}"
self.update_attribute(:private_token, random_key)
end
Ruby-China?刚看了一个 python 的 app 做法,大致做法是客户端注册时,生成 access_token
access_token = generate_access_token()
def generate_access_token():
# uuid.uuid1().hex => a3541742154011e49beb180373634345
return uuid.uuid1().hex
随后设置过期时间,并保存到 redis,返回给客户端
expire = time.time() + 30 * 24 * 3600
set_access_token(access_token, {'uid': str(uid)})
return {
'access_token': access_token,
'expire': expire
}, 201
ACCESS_TOKEN_KEY_FMT = "auth:access_token:{access_token}"
def set_access_token(access_token, login_info, expire=30 * 24 * 3600):
#' ACCESS_TOKEN_KEY_FMT.format(access_token=access_token) => auth:access_token:a3541742154011e49beb180373634345'
g.memdb.setex(ACCESS_TOKEN_KEY_FMT.format(access_token=access_token), expire, json.dumps(login_info))
登陆是携带 access_token 放入 Authorization Authorization 形如 YWNjZXNzX3Rva2VuPTIwNzMwNDVhZTgyNzExZTM4MTMwYjhlODU2MmFhZGM4 是把 access_token=2073045ae82711e38130b8e8562aadc8 base64.urlsafe_b64encode(b'access_token=2073045ae82711e38130b8e8562aadc8') 后的结果, 服务端先解码,然后解析为数组,取出 access_token,然后从 redis 取出 uid,再从 mongodb 取得用户。定义的是一个 login_required 包裹
def login_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
'''
Check and parse the ``Authorization`` Header to get ``access_token`` and valify it.
If user has logined, then this function will call the handler function directory, or it will
return ``401 Unauthorized``.
'''
reqparser = reqparse.RequestParser()
reqparser.add_argument('Authorization', type=str, required=True, location='headers')
reqargs = reqparser.parse_args()
try:
token_encoded = parse_qs(base64.urlsafe_b64decode(reqargs['Authorization']))
if b'access_token' not in token_encoded:
abort(401, message='Access token is required')
access_token = token_encoded[b'access_token'][0].decode()
except:
abort(401, message='Malformed access token')
login_info = get_access_token(access_token)
if login_info is None:
abort(401, message='Access token is expired')
g.current_uid = ObjectId(login_info['uid'])
return func(*args, **kwargs)
return wrapper
登出代码
class LogoffHandler(restful.Resource):
@login_required
def get(self):
argparser = reqparse.RequestParser()
argparser.add_argument('Authorization', type=str, location='headers')
args = argparser.parse_args()
token_encoded = parse_qs(base64.urlsafe_b64decode(args['Authorization']))
access_token = token_encoded[b'access_token'][0].decode()
del_access_token(access_token)
app.logger.info('User `%s` logout' % str(g.current_uid))
return {}
请问有什么问题吗? 这篇帖子也不错 http://www.cnblogs.com/TankXiao/archive/2012/09/26/2695955.html
#5 楼 @blacktulip just a word, thx
#3 楼 @Peter lambda 会返回它的调用函数,但 Proc 会结束它所位于的 function
def return_from_proc
ruby_proc = Proc.new { return "return from a Proc" }
ruby_proc.call
return "The function will NOT reach here because a Proc containing a return statement has been called"
end
def return_from_lambda
ruby_lambda = lambda { return "return from lambda" }
ruby_lambda.call
return "The function will reach here"
end
puts return_from_proc # display return from proc
puts return_from_lambda # display The function will reach here
求解释。lambda 会返回它的调用函数,但 Proc 会结束它所位于的 function
,这句话和代码怎么对应,我理解的和结果打印刚好相反。
嘿嘿,你一定是看漏了啥!