python 操作三大主流数据库 第九课mongoDB实战

python 操作三大主流数据库 第九课

tags:

  • python3
  • 慕课网

categories:

  • python3
  • MongoDB
  • ODM

第一节 flask-mongoengine安装及连接

1. flask-mongoengine安装

1. 安装:pip install -i https://pypi.douban.com/simple/ flask-mongoengine
2. 文档: http://flask-mongoengine.readthedocs.io/en/latest/

2. flask-mongoengine连接MongoDB数据库

1. 首先把MongoDB的服务启动起来mongod.exe --dbpath D:\MongoDB\DB
```python
from flask_mongoengine import MongoEngine
app = Flask(__name__)  # 构造出一个app对象

app.config['MONGODB_SETTINGS'] = {
    'db': 'mongo_news',
    'host': '127.0.0.1',
    'port': 27017
}
db = MongoEngine(app)
```
2. 创建mongo_news表 use mongo_news

第二节 展示页面数据查询源码

1. 前台的分页不需要变动,封装语法相同 
# coding:utf-8
from flask import Flask, render_template, redirect, flash, url_for
from datetime import datetime
from flask_mongoengine import MongoEngine
from mongoengine import *
from forms import NewsForm_mongo

app = Flask(__name__, template_folder='templates_mongo')
app.config['MONGODB_SETTINGS'] = {
    'db': 'mongo_news',
    'host': '127.0.0.1',
    'port': 27017
}
db = MongoEngine(app)

app.config['SECRET_KEY'] = 'this is a mongodb key'

# 新闻类型
NEWS_TYPES = (
    ('推荐', '推荐'),
    ('百家', '百家'),
    ('本地', '本地'),
    ('图片', '图片')
)


class News(db.Document):
    ''' 新闻 '''
    title = db.StringField(required=True, max_lenght=64)
    content = db.StringField(required=True)
    news_type = db.StringField(required=True, choices=NEWS_TYPES)
    img_url = db.StringField()
    is_valid = db.BooleanField(default=True)
    created_at = db.DateTimeField(default=datetime.now())
    updated_at = db.DateTimeField(default=datetime.now())

    # def clean(self):
    #     if '黄' in self.title:
    #         raise db.ValidationError("不能有黄字")

    meta = {
        'collection': 'news',
        'ordering': ['-created_at']
    }


@app.route('/', methods=['get'])
def index():
    ''' 首页 '''
    # return 'ok'
    news_list = News.objects.filter(is_valid=True).all()
    print(news_list)
    return render_template('index.html', news_list=news_list)


@app.route('/cat/<name>/', methods=['GET', 'POST'])
def cat(name):
    ''' 栏目 '''
    news_list = News.objects.filter(is_valid=True, news_type=name).all()
    return render_template('cat.html', news_list=news_list)


@app.route('/detail/<pk>/', methods=['GET', 'POST'])
def detail(pk):
    ''' 新闻详情页 '''
    # 如果新闻不存在则报404错误
    obj = News.objects.filter(pk=pk).first_or_404()
    return render_template('detail.html', obj=obj)


@app.route('/admin/', methods=['GET', 'POST'])
@app.route('/admin/<page>/', methods=['GET', 'POST'])
def admin(page=None):
    ''' 后台首页 '''
    # 如果page参数没有传就默认显示首页
    if page == None:
        page = 1
    page_data = News.objects.paginate(page=int(page), per_page=5)
    return render_template('admin/index.html', page_data=page_data, page=int(page))


@app.route('/admin/add/', methods=['GET', 'POST'])
def add():
    ''' 添加新闻 '''
    form = NewsForm_mongo()
    if form.validate_on_submit:
        # 获取数据
        new_obj = News(
            title=form.title.data,
            content=form.content.data,
            news_type=form.news_type.data,
            img_url=form.img_url.data
        )
        new_obj.save()
        flash('新闻添加成功')
        return redirect(url_for('admin'))
    return render_template('admin/add.html', form=form)


@app.route('/admin/delete/<pk>/', methods=['GET', 'POST'])
def delete(pk):
    ''' 删除新闻 '''
    new_obj = News.objects.filter(pk=pk).first()
    print(new_obj.title)
    if not new_obj:
        return 'no'
    # 逻辑删除
    new_obj.is_valid = False
    new_obj.save()
    return 'yes'

    # 物理删除
    # new_obj.delete()
    # return 'yes'


@app.route('/admin/update/<pk>/', methods=['POST', 'GET'])
def update(pk):
    ''' 修改新闻 '''
    new_obj = News.objects.get_or_404(pk=pk)
    print(new_obj.title)
    form = NewsForm_mongo(obj=new_obj)
    if form.validate_on_submit():
        new_obj.title = form.title.data
        new_obj.content = form.content.data
        new_obj.news_type = form.news_type.data
        new_obj.img_url = form.img_url.data

        new_obj.save()
        flash('新闻修改成功')
        return redirect(url_for('admin'))
    return render_template('admin/update.html', form=form)


if __name__ == "__main__":
    app.run(debug=True)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值