2024-09-04

在MongoDB中,您可以使用db.createUser()方法来创建一个全局只读账户。以下是创建全局只读用户的示例代码:




use admin;
 
db.createUser({
  user: "readonlyUser",
  pwd: "readonlyPass",
  roles: [
    { role: "readAnyDatabase", db: "admin" }
  ]
});

这段代码将在admin数据库中创建一个名为readonlyUser的用户,其密码是readonlyPass。该用户被赋予了readAnyDatabase角色,这意味着他们可以读取所有数据库,但不能进行写入或修改操作。

请确保在实际环境中更换密码,并且使用复杂度较高的密码来保障安全。

2024-09-04

在MongoDB中,你可以使用$gt (greater than) 和 $lt (less than) 操作符来实现大于和小于查询。以下是一个使用MongoDB的Node.js驱动进行大于和小于查询的例子:




const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'mydatabase';
const client = new MongoClient(url, { useUnifiedTopology: true });
 
async function queryDocuments() {
  try {
    await client.connect();
    console.log('Connected to server');
    const db = client.db(dbName);
    const collection = db.collection('documents');
 
    // 查询大于某个值
    const greaterThanQuery = await collection.find({ age: { $gt: 20 } }).toArray();
    console.log('Documents greater than 20:', greaterThanQuery);
 
    // 查询小于某个值
    const lessThanQuery = await collection.find({ age: { $lt: 30 } }).toArray();
    console.log('Documents less than 30:', lessThanQuery);
 
  } finally {
    await client.close();
  }
}
 
queryDocuments().catch(console.error);

在这个例子中,我们首先连接到MongoDB数据库,然后选择相应的集合。接着,我们使用$gt来查询age字段大于20的文档,使用$lt来查询age字段小于30的文档。最后,我们将查询结果输出到控制台,并在完成后关闭数据库连接。

2024-09-04



import requests
from pymongo import MongoClient
from lxml import etree
 
# 爬取方法
def crawl_tv_rank(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    return None
 
# 解析方法
def parse_html(html):
    html = etree.HTML(html)
    rank_list = html.xpath('//dl[@class="tv-rank-list"]/dd')
    data_list = []
    for rank in rank_list:
        data = {
            'name': rank.xpath('./a/text()')[0],
            'score': rank.xpath('./p[@class="score"]/text()')[0],
            'rank': rank.xpath('./p[@class="num"]/text()')[0].strip()
        }
        data_list.append(data)
    return data_list
 
# 存储方法
def save_to_mongo(data_list, mongo_url, db_name, collection_name):
    client = MongoClient(mongo_url)
    db = client[db_name]
    collection = db[collection_name]
    collection.insert_many(data_list)
 
# 主函数
def main():
    url = 'http://top.tv.sohu.com/rank_tab_1_3'
    html = crawl_tv_rank(url)
    data_list = parse_html(html)
    save_to_mongo(data_list, 'localhost', 'tv_rank', 'sohu')
 
if __name__ == '__main__':
    main()

这段代码实现了从国内知名视频网站搜狐TV抓取电视剧热榜的功能,并将数据存储到MongoDB数据库中。代码遵循了优秀的编程实践,例如提取了爬取、解析和存储的函数,并在主函数中调用。同时,代码中包含了错误处理和headers设置,这些都是爬虫工程师应当注意的要点。

2024-09-04

在MongoDB中,基本操作包括连接数据库、选择集合、插入文档、查询文档、更新文档、删除文档等。以下是使用MongoDB的Node.js驱动程序执行这些操作的示例代码:




const { MongoClient } = require('mongodb');
 
// MongoDB连接URL
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);
 
// 使用connect方法来连接到服务器
async function run() {
  try {
    await client.connect();
    console.log('Connected successfully to server');
 
    // 连接到数据库
    const db = client.db('mydatabase');
 
    // 选择集合
    const collection = db.collection('mycollection');
 
    // 插入文档
    const insertResult = await collection.insertOne({ a: 1 });
    console.log('Insert document:', insertResult);
 
    // 查询文档
    const query = { a: 1 };
    const docs = await collection.find(query).toArray();
    console.log('Found documents:', docs);
 
    // 更新文档
    const updateResult = await collection.updateOne(
      { a: 1 },
      { $set: { b: 2 } }
    );
    console.log('Updated document:', updateResult);
 
    // 删除文档
    const deleteResult = await collection.deleteOne({ a: 1 });
    console.log('Deleted document:', deleteResult);
 
  } finally {
    // 确保在结束程序前关闭数据库连接
    await client.close();
  }
}
 
run().catch(console.dir);

在这个例子中,我们首先创建了一个MongoClient实例,然后使用connect方法连接到MongoDB服务器。接下来,我们选择了数据库mydatabase并且选择了集合mycollection。然后我们分别进行了插入、查询、更新和删除操作。最后,在操作完成后,我们使用close方法关闭了数据库连接。

2024-09-04

在Django中,我们可以使用cookie和session来记住用户的浏览器。

  1. 使用cookie

Django提供了一个方便的装饰器django.contrib.auth.decorators.login_required,可以用来要求用户登录才能访问某个视图。




from django.contrib.auth.decorators import login_required
 
@login_required
def my_view(request):
    ...

此外,我们也可以在代码中设置cookie:




def my_view(request):
    # 设置cookie
    response = HttpResponse("Hello, World!")
    response.set_cookie('my_cookie', 'cookie_value')
    return response
  1. 使用session

Django也提供了session框架,允许我们在多个页面请求中保持状态。




def my_view(request):
    # 设置session
    request.session['my_session'] = 'session_value'
    return HttpResponse("Hello, World!")

在模板中,我们也可以使用session:




{% if request.session.my_session %}
    <p>Session value is: {{ request.session.my_session }}</p>
{% else %}
    <p>There is no session value.</p>
{% endif %}
  1. 删除cookie和session



def my_view(request):
    # 删除cookie
    response = HttpResponse("Hello, World!")
    response.delete_cookie('my_cookie')
    return response
 
def my_view(request):
    # 删除session
    if 'my_session' in request.session:
        del request.session['my_session']
    return HttpResponse("Hello, World!")

以上就是在Django中使用cookie和session的基本方法。

2024-09-04



# 在urls.py中导入Django的路由函数
from django.urls import path
from . import views
 
urlpatterns = [
    # 使用path函数定义路由,关联到视图函数
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

这个例子展示了如何在Django中使用path函数来定义路由,并将它们关联到视图函数。这里使用了位置参数和类型化参数(如<int:year>)来构建灵活的URL模式。

2024-09-04

在MongoDB中,可以使用rs.initiate(), rs.add(), rs.status(), rs.reconfig()等命令来操作复制集。以下是一些基本操作的示例代码:

  1. 启动复制集:



// 在主节点上执行
rs.initiate(
  {
    _id: "myReplicaSet",
    members: [
      { _id: 0, host: "mongodb0.example.net:27017" },
      { _id: 1, host: "mongodb1.example.net:27017" },
      { _id: 2, host: "mongodb2.example.net:27017" }
    ]
  }
)
  1. 添加副本节点:



// 在主节点上执行
rs.add("mongodb3.example.net:27017")
  1. 查看复制集状态:



// 在任意节点上执行
rs.status()
  1. 移除副本节点:



// 在主节点上执行
rs.remove("mongodb3.example.net:27017")
  1. 强制副本集重配置:



// 在主节点上执行
var config = rs.config();
// 修改 config 对象以添加或移除成员
rs.reconfig(config);
  1. 备份和恢复操作:



// 备份主节点数据
mongodump --host mongodb0.example.net:27017 --dumpDb mydb --out /backup/mydb.bson
 
// 恢复到副本节点
mongorestore --host mongodb3.example.net:27017 --db mydb /backup/mydb.bson

注意:在实际操作中,需要根据自己的MongoDB服务器的实际IP和端口以及数据库名称来替换上述代码中的示例。同时,对于生产环境,应该在副本集的次要节点上执行读操作,并确保执行这些操作的用户具有相应的权限。

2024-09-04



from pymongo import MongoClient
 
# 连接到MongoDB
client = MongoClient('mongodb://localhost:27017/')
 
# 选择数据库
db = client['mydatabase']
 
# 选择集合(类似于SQL中的表)
collection = db['mycollection']
 
# 插入文档
collection.insert_one({'name': 'Alice', 'age': 25, 'location': 'Wonderland'})
 
# 查询文档
alice = collection.find_one({'name': 'Alice'})
print(alice)
 
# 更新文档
collection.update_one({'name': 'Alice'}, {'$set': {'age': 30}})
 
# 删除文档
collection.delete_one({'name': 'Alice'})
 
# 关闭连接
client.close()

这段代码展示了如何使用pymongo库连接到MongoDB,选择数据库和集合,插入、查询、更新和删除文档。最后,代码关闭了MongoDB的连接。这是一个非常基础的示例,但对于学习如何在Python中操作MongoDB是有帮助的。

2024-09-04

在MongoDB中,数据是以BSON(Binary JSON)格式存储的,BSON是一种类json的二进制格式,它包含了比json更丰富的数据类型。

以下是一些在MongoDB中使用的基本操作:

  1. 连接MongoDB数据库

在Python中,我们可以使用pymongo库来连接MongoDB。首先需要安装这个库,可以使用pip安装:




pip install pymongo

然后,我们可以使用以下代码连接到MongoDB:




from pymongo import MongoClient
 
client = MongoClient('localhost', 27017)
  1. 选择数据库和集合

在MongoDB中,数据是存储在数据库和集合中的。集合就相当于关系数据库中的表。




db = client['test_database']  # 选择或创建一个名为 'test_database' 的数据库
collection = db['test_collection']  # 选择或创建一个名为 'test_collection' 的集合
  1. 插入文档

在MongoDB中,文档是数据的基本单位,它相当于关系数据库中的行。




post = {"name": "test", "age": 18}
collection.insert_one(post)  # 插入一个文档
  1. 查询文档



# 查询所有文档
for post in collection.find():
    print(post)
 
# 查询名为test的文档
for post in collection.find({"name": "test"}):
    print(post)
  1. 更新文档



collection.update_one({"name": "test"}, {"$set": {"age": 20}})  # 将名为test的文档的age更新为20
  1. 删除文档



collection.delete_one({"name": "test"})  # 删除名为test的文档

以上就是一些基本的MongoDB操作,实际使用中可以根据需要进行更复杂的查询和更新操作。

2024-09-04

在Windows环境下,使用Django和Nginx部署静态资源的基本步骤如下:

  1. 安装Nginx和配置。
  2. 设置Django项目以收集静态文件。
  3. 配置Nginx来服务静态文件。

以下是具体的步骤和示例配置:

  1. 安装Nginx:

    下载Windows版本的Nginx (http://nginx.org/en/download.html),解压后打开目录,运行\`start nginx\`启动服务器。

  2. 设置Django项目以收集静态文件:

    在Django项目的settings.py中,设置STATIC_ROOT指向一个目录,用于收集静态文件。




# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static_collected')

然后运行以下命令收集静态文件:




python manage.py collectstatic
  1. 配置Nginx来服务静态文件:

    编辑Nginx的配置文件(通常位于nginx/conf/nginx.conf),在http块中添加一个server块来处理静态文件的请求。




http {
    server {
        listen       80;
        server_name  localhost;
 
        location /static/ {
            root /path/to/django/static_collected;
            expires 30d;
        }
    }
}

确保替换/path/to/django/static_collected为你的静态文件实际收集路径。

  1. 重启Nginx以应用更改:



nginx -s reload

现在,当你访问http://your-domain.com/static/<path-to-static-file>时,Nginx将提供相应的静态文件。