我曾经偶尔搜索电子商务网页以获取产品价格信息.我有一段时间没有使用使用Scrapy构建的刮刀,昨天试图使用它 - 我遇到了机器人保护问题.
它正在使用CloudFlare的DDOS保护,它基本上使用JavaScript评估过滤掉禁用JS的浏览器(以及因此刮刀).评估函数后,将生成带有计算数字的响应.作为回报,服务发送回两个身份验证cookie,附加到每个请求允许正常爬网站点.以下是它如何工作的描述.
我还发现了一个cloudflare-scrape Python模块,它使用外部JS评估引擎来计算数量并将请求发送回服务器.我不知道如何将它整合到Scrapy中.或者可能有一种更聪明的方式而不使用JS执行?最后,它是一种形式......
我会帮助你.
所以我决定尝试权威的用户授权解决方案.我想知道如何policy
在视图中使用帮助器,实例变量可能是nil,如下面的简单情况:
应用程序/视图/项目/ index.html.slim
h1 Projects
(...)
- if policy(@project).create?
= link_to 'New Project', new_project_path
Run Code Online (Sandbox Code Playgroud)
应用程序/控制器/ projects_controller.rb
(...)
def index
@projects = Project.all
end
(...)
Run Code Online (Sandbox Code Playgroud)
应用程序/政策/ project_policy.rb
class ProjectPolicy < Struct.new(:user, :project)
def create?
user.has_role? :admin
end
Run Code Online (Sandbox Code Playgroud)
我想在Projects #index页面上显示一个"New Project"链接,但是我在这个视图中没有@project实例变量,但是收到错误:
Pundit :: Projects#index中的NotDefinedError
无法找到策略NilClassPolicy
错误显然是因为我传递了@project
nil的实例变量,因此有一个NilClass,显然我没有必要授权.
我找到了2个解决这个问题的方法,使它运行正常,但它们似乎都不合适:
policy(@projects[0])
@project = Project.new
(或直接在视图类似于上文:policy(Project.new)
)第一个解决方案将导致@projects数组中的相同错误为空,而第二个解决方案将创建冗余实例变量.所有策略帮助程序需要知道的是我希望在哪个类上强制执行授权逻辑.
有关正确实现方法的任何建议吗?