![](/img/trans.png)
[英]How to query dates in MongoDB using $gte and $lte with flask-mongoengine?
[英]Flask app unable to query data from mongodb using mongoengine in a dockerized setup
我正在運行一個網站應用程序,並且正在使用Flask來使用mongoengine查詢mongodb數據庫。 當應用程序嘗試查詢數據庫時出現錯誤。
我在其中一個容器中安裝了mongodb,並且可以成功連接到它。
mongodb: 2019-09-06T03:45:11.801+0000 I NETWORK [conn1] received client metadata from 172.20.0.3:43918 conn1: { driver: { name: "PyMongo", version: "3.9.0" }, os: { type: "Linux", name: "Linux", architecture: "x86_64", version: "3.10.0-957.27.2.el7.x86_64" }, platform: "CPython 3.7.2.final.0" }
Docker安裝
version: "3.7"
services:
portfolio:
build: ./portfolio
container_name: portfolio
restart: always
environment:
- APP_NAME=portfolio
expose:
- 8080
links:
- mongodb
admin:
build: ./admin
container_name: admin
restart: always
environment:
- APP_NAME=admin
expose:
- 8089
links:
- mongodb
mongodb:
image: mongo
container_name: mongodb
ports:
- "27017:27017"
nginx:
build: ./nginx
depends_on:
- portfolio
- admin
container_name: nginx
restart: always
ports:
- "80:80"
Python設置:
from flask import Flask
from mongoengine import connect
app = Flask(__name__)
connect('spees_db', host='mongodb://mongodb:27017/spees_db')
email_ex = User.objects(email=email).first()
錯誤堆棧:
nginx | 102.140.206.140 - - [06/Sep/2019:03:53:09 +0000] "GET /register HTTP/1.1" 200 4145 "http://admin.shemoirere.com/login?next=%2F" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" "-"
[pid: 13|app: 0|req: 4/5] 102.140.206.140 () {44 vars in 967 bytes} [Fri Sep 6 03:53:09 2019] GET /register => generated 4145 bytes in 10 msecs (HTTP/1.1 200) 4 headers in 192 bytes (1 switches on core 1)
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2463, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "./admin/views.py", line 37, in do_register
email_ex = User.objects(email=email).first()
File "/usr/local/lib/python3.7/site-packages/mongoengine/queryset/manager.py", line 37, in __get__
queryset = queryset_class(owner, owner._get_collection())
File "/usr/local/lib/python3.7/site-packages/mongoengine/document.py", line 207, in _get_collection
db.client.is_primary:
File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1006, in is_primary
return self._server_property('is_writable')
File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 831, in _server_property
writable_server_selector)
File "/usr/local/lib/python3.7/site-packages/pymongo/topology.py", line 231, in select_server
nginx | 2019/09/06 03:53:50 [error] 6#6: *5 upstream prematurely closed connection while reading response header from upstream, client: 102.140.206.140, server: admin.shemoirere.com, request: "POST /register HTTP/1.1", upstream: "uwsgi://172.20.0.4:8089", host: "admin.shemoirere.com", referrer: "http://admin.shemoirere.com/register"
nginx | 102.140.206.140 - - [06/Sep/2019:03:53:50 +0000] "POST /register HTTP/1.1" 502 559 "http://admin.shemoirere.com/register" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" "-"
address))
File "/usr/local/lib/python3.7/site-packages/pymongo/topology.py", line 189, in select_servers
selector, server_timeout, address)
File "/usr/local/lib/python3.7/site-packages/pymongo/topology.py", line 205, in _select_servers_loop
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
我和您的倉庫一起玩,弄清楚了您的問題。 這是您的wsgi配置-
[uwsgi] wsgi文件= run.py可調用=應用程序套接字=:8089進程= 4個線程= 2個主服務器=真chmod-socket = 660真空=真die-on-term =真
問題出在processes
參數中。 uwsgi啟動一個主進程,然后使用fork()生成工作程序。 你在做你的connect
初始startup-期間所以連接住在你的主進程,而你的孩子們得到一個壞的副本。 當發生連接時,您實際上可以看到mongo上的日志...僅1個! pymongo特別指出fork()與連接不安全。
最簡單的解決方法是在該wsgi文件的末尾添加lazy-apps = true
。 系統將按預期工作。 您還可以設置您的應用程序以避免在第一次需要connect
時才真正調用connect
(可能是在第一個請求鈎子之前?)
https://api.mongodb.com/python/3.9.0/faq.html#is-pymongo-fork-safe
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.