Sau một số yêu cầu về mẫu Flask và RethinkDB cơ bản, tôi quyết định tiếp tục và viết một bài đăng trên blog. Đây là bài đăng đó.
BTW:Chúng tôi luôn hoan nghênh các yêu cầu. Nếu bạn có điều gì đó muốn chúng tôi viết hoặc xây dựng, hãy gửi email cho chúng tôi.
Hôm nay, chúng tôi sẽ tạo một đơn giản danh sách việc cần làm mà bạn có thể sửa đổi để đáp ứng nhu cầu của riêng mình. Trước khi bắt đầu, tôi thực sự khuyên bạn nên đọc qua bài viết này, trong đó nêu chi tiết về sự khác biệt của RethinkDB so với một số cơ sở dữ liệu NoSQL khác.
Thiết lập RethinkDB
Cài đặt RethinkDB
Điều hướng tại đây và tải xuống gói thích hợp cho hệ thống của bạn. Tôi đã sử dụng Homebrew - $ brew install rethinkdb
- và mất gần hai mươi phút để tải xuống và cài đặt bản dựng:
==> Installing rethinkdb
==> Downloading http://download.rethinkdb.com/dist/rethinkdb- 1.11.2.tgz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/rethinkdb/1.11.2 -- fetch v8 --fetch protobuf
==> make
==> make install-osx
==> Caveats
To have launchd start rethinkdb at login:
ln -sfv /usr/local/opt/rethinkdb/*.plist ~/Library/LaunchAgents
Then to load rethinkdb now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.rethinkdb.plist
==> Summary
🍺 /usr/local/Cellar/rethinkdb/1.11.2: 174 files, 29M, built in 19.7 minutes
Cài đặt trình điều khiển Python trên toàn cầu
$ sudo pip install rethinkdb
Lưu ý: Tôi đã cài đặt Rethink trên toàn cầu (bên ngoài virtualenv) vì tôi có thể sẽ sử dụng cùng một phiên bản với một số dự án, với một số ngôn ngữ khác nhau. Chúng tôi sẽ cài đặt trong virtualenv sau trong hướng dẫn này.
Kiểm tra thiết lập của bạn
Trước tiên, hãy khởi động máy chủ bằng lệnh sau:
$ rethinkdb
Nếu tất cả được cài đặt đúng cách, bạn sẽ thấy một cái gì đó tương tự như:
info: Creating directory /Users/michaelherman/rethinkdb_data
info: Creating a default database for your convenience. (This is because you ran 'rethinkdb' without 'create', 'serve', or '--join', and the directory '/Users/michaelherman/rethinkdb_data' did not already exist.)
info: Running rethinkdb 1.11.2 (CLANG 4.2 (clang-425.0.28))...
info: Running on Darwin 12.4.0 x86_64
info: Loading data from directory /Users/michaelherman/rethinkdb_data
info: Listening for intracluster connections on port 29015
info: Listening for client driver connections on port 28015
info: Listening for administrative HTTP connections on port 8080
info: Listening on addresses: 127.0.0.1, ::1
info: To fully expose RethinkDB on the network, bind to all addresses
info: by running rethinkdb with the `--bind all` command line option.
info: Server ready
Sau đó kiểm tra kết nối. Mở một cửa sổ mới trong thiết bị đầu cuối của bạn và nhập các lệnh sau:
>>>$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()
Bạn sẽ thấy:
>>><rethinkdb.net.Connection object at 0x101122410>
Thoát khỏi trình bao Python nhưng để máy chủ RethinkDB đang chạy trong cửa sổ đầu cuối khác.
Thiết lập dự án Bình cơ bản
Tạo một thư mục để lưu trữ dự án của bạn
$ mkdir flask-rethink
$ cd flask-rethink
Thiết lập và kích hoạt virtualenv
$ virtualenv --no-site-packages env
$ source env/bin/activate
Cài đặt Flask và Flask-WTF
$ pip install flask
$ pip install flask-wtf
Tạo tệp yêu cầu Pip
$ pip freeze > requirements.txt
Tải xuống bảng chuẩn của bình
Tìm thấy trong thư mục mẫu của repo này. Cấu trúc dự án của bạn bây giờ sẽ giống như sau:
├── app
│ ├── __init__.py
│ ├── forms.py
│ ├── models.py
│ ├── templates
│ │ ├── base.html
│ │ └── index.html
│ └── views.py
├── readme.md
├── requirements.txt
└── run.py
Chạy ứng dụng
$ python run.py
Điều hướng đến http:// localhost:5000 / và bạn sẽ thấy:
Đừng cố gửi bất cứ thứ gì, vì trước tiên chúng ta cần thiết lập cơ sở dữ liệu. Hãy bắt đầu RethinkDB.
Cấu hình RethinkDB
Cài đặt RethinkDB
$ pip install rethinkdb
Thêm mã sau vào “views.py”
# rethink imports
import rethinkdb as r
from rethinkdb.errors import RqlRuntimeError
# rethink config
RDB_HOST = 'localhost'
RDB_PORT = 28015
TODO_DB = 'todo'
# db setup; only run once
def dbSetup():
connection = r.connect(host=RDB_HOST, port=RDB_PORT)
try:
r.db_create(TODO_DB).run(connection)
r.db(TODO_DB).table_create('todos').run(connection)
print 'Database setup completed'
except RqlRuntimeError:
print 'Database already exists.'
finally:
connection.close()
dbSetup()
# open connection before each request
@app.before_request
def before_request():
try:
g.rdb_conn = r.connect(host=RDB_HOST, port=RDB_PORT, db=TODO_DB)
except RqlDriverError:
abort(503, "Database connection could be established.")
# close the connection after each request
@app.teardown_request
def teardown_request(exception):
try:
g.rdb_conn.close()
except AttributeError:
pass
Kiểm tra các nhận xét để biết giải thích ngắn gọn về chức năng của từng chức năng.
Khởi động lại máy chủ của bạn
Bạn sẽ thấy cảnh báo sau trong thiết bị đầu cuối của mình:
Database setup completed
Nếu bạn thấy lỗi này
rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015.
máy chủ RethinkDB của bạn không chạy. Mở cửa sổ dòng lệnh mới và chạy$ rethinkdb
.
Vì vậy, chúng tôi đã tạo một cơ sở dữ liệu mới có tên là “việc cần làm”, có một bảng được gọi là “việc cần làm”.
Bạn có thể xác minh điều này trong Quản trị viên của RethinkDB. Điều hướng đến http:// localhost:8080 /. Quản trị viên sẽ tải. Nếu bạn nhấp vào “Bảng”, bạn sẽ thấy cơ sở dữ liệu và bảng mà chúng tôi đã tạo:
Công việc hiển thị
Với thiết lập cơ sở dữ liệu, hãy thêm mã để hiển thị các việc cần làm. Cập nhật index()
chức năng trong “views.py”:
@app.route("/")
def index():
form = TaskForm()
selection = list(r.table('todos').run(g.rdb_conn))
return render_template('index.html', form=form, tasks=selection)
Ở đây, chúng tôi đang chọn bảng "việc cần làm", kéo tất cả dữ liệu trong JSON và chuyển toàn bộ bảng sang mẫu.
Thêm dữ liệu theo cách thủ công
Trước khi chúng ta có thể xem bất kỳ việc cần làm nào, trước tiên chúng ta cần thêm một số việc cần làm. Hãy xem qua shell và thêm chúng vào theo cách thủ công.
>>>$ python
>>> import rethinkdb
>>> conn = rethinkdb.connect(db='todo')
>>> rethinkdb.table('todos').insert({'name':'sail to the moon'}).run(conn)
{u'errors': 0, u'deleted': 0, u'generated_keys': [u'c5562325-c5a1-4a78-8232-c0de4f500aff'], u'unchanged': 0, u'skipped': 0, u'replaced': 0, u'inserted': 1}
>>> rethinkdb.table('todos').insert({'name':'jump in the ocean'}).run(conn)
{u'errors': 0, u'deleted': 0, u'generated_keys': [u'0a3e3658-4513-48cb-bc68-5af247269ee4'], u'unchanged': 0, u'skipped': 0, u'replaced': 0, u'inserted': 1}
>>> rethinkdb.table('todos').insert({'name':'think of another todo'}).run(conn)
{u'errors': 0, u'deleted': 0, u'generated_keys': [u'b154a036-3c3b-47f4-89ec-cb9f4eff5f5a'], u'unchanged': 0, u'skipped': 0, u'replaced': 0, u'inserted': 1}
>>>
Vì vậy, chúng tôi đã kết nối với cơ sở dữ liệu, sau đó nhập ba đối tượng mới vào bảng trong cơ sở dữ liệu. Kiểm tra tài liệu API để biết thêm thông tin.
Khởi động máy chủ. Bây giờ bạn sẽ thấy ba nhiệm vụ:
Hoàn thiện biểu mẫu
Cập nhật index()
hoạt động lại để kéo dữ liệu từ biểu mẫu và thêm nó vào cơ sở dữ liệu:
@app.route('/', methods = ['GET', 'POST'])
def index():
form = TaskForm()
if form.validate_on_submit():
r.table('todos').insert({"name":form.label.data}).run(g.rdb_conn)
return redirect(url_for('index'))
selection = list(r.table('todos').run(g.rdb_conn))
return render_template('index.html', form = form, tasks = selection)
Kiểm tra điều này ra. Thêm một số việc cần làm. Phát điên lên.
Kết luận &Thách thức
Ứng dụng hiện tại vẫn hoạt động tốt, nhưng chúng tôi có thể làm được nhiều việc hơn thế. Đưa ứng dụng này lên cấp độ tiếp theo.
Dưới đây là một vài ý tưởng:
- Thêm thông tin đăng nhập của người dùng.
- Tạo một biểu mẫu mạnh mẽ hơn, trong đó bạn có thể thêm ngày hoàn thành cho từng việc cần làm, sau đó sắp xếp việc cần làm theo ngày đó trước khi hiển thị chúng vào DOM.
- Thêm các bài kiểm tra chức năng và đơn vị.
- Thêm khả năng tạo các nhiệm vụ phụ cho mỗi nhiệm vụ.
- Đọc qua các tài liệu tham khảo API. Chơi xung quanh bằng nhiều phương pháp khác nhau.
- Mô-đun hóa ứng dụng.
- Cấu trúc lại mã. Hãy khoe mã mới của bạn với RethinkDB.
Bạn muốn xem gì khác? Bạn muốn xem phần 2? Bạn thích RethinkDB như thế nào so với MongoDB? Chia sẻ suy nghĩ của bạn bên dưới.
Bạn có thể lấy tất cả mã từ repo. Chúc mừng!