Meteor/python/mongoDB如何从后台运行的进程更新mongoDB?

2024-05-23 23:41:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经开始创建meteor应用程序,我想在我使用后台任务定义的mongoDB集合中插入文档

比如说,我每天都在阅读rss提要,在网站上搜索新闻标题

要求

  1. 阅读rss提要并浏览必要的网站
  2. 将新标题放入meteor应用程序使用的mongoDB集合中

我所知道的

我知道怎么做。使用python,使用requests和其他库。 我知道如何通过meteor中的javascript将信息添加到集合中,但通过遵循todo示例应用程序教程,我知道如何通过后台任务将信息添加到集合中

可能的解决方案

  1. 用python获取数据,然后通过python将该数据添加到mongoDB集合。然后,它将在某种后台进程的服务器上运行
  2. 使用meteor中的某种库,它允许我运行后台任务和webscraping,然后我可以使用它来更新集合

最简单的例子来自this step of the todo app

我想自动化的步骤是:

meteor mongo
db.tasks.insert( { text : 'New title' , createdAt: new Date() } );

其中New title是一些废弃/rss提要的结果

实现这一目标的最佳方式是什么?我比较精通python,但对JS和meteor完全陌生

其他评论

此外,我还没有在下面的示例中包括这一点,但我还希望使用accounts-uiaccounts-password包,并将删除insecure包。不确定这将如何影响后台进程的实现

最小示例

(如果这不是很小,很抱歉,但不确定如何使其变小)

  • 客户
    • main.html
    • main.jsx
  • 服务器
    • main.js
  • 进口
    • 原料药
      • tasks.js
    • 用户界面
      • App.jsx
      • Task.jsx

client/main.html

<head>
  <title>Todo List</title>
</head>
<body>
  <div id='render-target'></div>
</body>

client/main.jsx

import React from 'react';                                                                  
import { Meteor } from 'meteor/meteor';
import { render } from 'react-dom';

import App from '../imports/ui/App.jsx';

Meteor.startup( () => {
    render( <App/> , document.getElementById( 'render-target' ) );
});

server/main.js

import '../imports/api/tasks.js'

imports/api/tasks.js

import { Mongo } from 'meteor/mongo';                                                       

export const Tasks = new Mongo.Collection( 'tasks' );

imports/ui/App.jsx

import React , { Component , PropTypes } from 'react';                                      
import { createContainer } from 'meteor/react-meteor-data';

import { Tasks } from '../api/tasks.js';

import Task from './Task.jsx';

class App extends Component {

    renderTasks() {
        return this.props.tasks.map( ( task ) => (
            <Task key={task._id} task={task} />
        ) );
    }   

    render() {
        return (
            <div className='container'>
                <header>
                    <h1>Todo List</h1>
                </header>

                <ul>
                    { this. renderTasks() }
                </ul>
            </div>
        );
    }   
}

App.propTypes = { 
    tasks : PropTypes.array.isRequired,
};

export default createContainer( () => {
    return {
        tasks : Tasks.find( {} ).fetch(),
    };  
} , App );

imports/ui/Task.jsx

import React, { Component , PropTypes } from 'react';                                       

// Task component - represents a single todo item
export default class Task extends Component {
    render() {
        return (
            <li>{this.props.task.text}</li>
        );
    }   
}

Task.propTypes = { 
    // This component gets the task to display through a React prop.
    // We can use propTypes to indicate it is required
    task: PropTypes.object.isRequired,
};

Tags: fromimportapptasktitlemainjsrender
1条回答
网友
1楼 · 发布于 2024-05-23 23:41:21

使用您最熟悉的语言和工具进行刮取和插入,因为您提到了python,我想这将是您的选择。Pymongo使将python dict写入mongo变得非常容易

您可以运行自己的mongo版本,也可以访问默认版本。要获取默认连接字符串,请将cd放入meteor目录并键入:

$ meteor mongo -U

可能是这样的mongodb://127.0.0.1:3001/meteor. 因此,要从python连接到它:

from pymongo import MongoClient
connection = MongoClient("mongodb://127.0.0.1:3001/meteor")                           
db = connection.meteor.tasks

然后插入:

db.insert({ 'text' : title , 'createdAt': datetime.datetime.utcnow()} )

如果你使用你自己的数据库,反应流星组件将每10秒更新一次(它轮询)。如果您使用默认值,它将是即时的

相关问题 更多 >