1. 程式人生 > >python操作三大主流資料庫(10)python操作mongodb資料庫④mongodb新聞專案實戰

python操作三大主流資料庫(10)python操作mongodb資料庫④mongodb新聞專案實戰

python操作mongodb資料庫④mongodb新聞專案實戰

參考文件:http://flask-mongoengine.readthedocs.io/en/latest/

目錄:
[[email protected] mongodb_version01]# tree -L 3
.
├── flask_mongo_news.py
├── forms.py
├── static
│   ├── bootstrap-3.3.7-dist
│   │   ├── css
│   │   ├── fonts
│   │   └── js
│   ├── bootstrap-3.3.7-dist.zip
│   ├── datatables.min.css │   ├── datatables.min.js │   ├── img │   │   └── news │   ├── index.css │   ├── jquery-3.3.1.min.js │   └── main.css └── templates ├── admin │   ├── add.html │   ├── admin_base.html │   ├── index.html │   └── update.html ├── cat.html ├── detail.html ├── home_base.html └── index.html

1.環境準備

①安裝驅動程式flask-mongoengine

pip install flask-mongoengine

②向news集合中插入資料

db.news.insertMany(
    [
        {
            "title":"朝鮮特種部隊視訊公佈 展示士兵身體素質與意志",
            "img_url":"/static/img/news/01.png",
            "content":"在4月15日舉行的朝鮮閱兵式上,除了各式展出的導彈,最亮眼的恐怕要數佩戴夜視儀的朝鮮特種部隊了。4月19日,俄羅斯衛星網釋出了擷取自朝鮮官方電視臺關於朝鮮特種部隊士兵訓練與展示的視訊。在視訊中,儘管訓練科目並無太多新意,但是朝鮮士兵展示出了高度驚人的身體素質與頑強意志。
", "is_valid": true, "news_type":"推薦" }, { "title":"男子長得像\"祁同偉\"捱打 打人者:為何加害檢察官", "img_url":"/static/img/news/02.png", "content":"因與熱門電視劇中人物長相相近,男子竟然招來一頓拳打腳踢。4月19日,打人男子周某被抓獲。半個月前,酒後的周某看到KTV裡有一名男子很像電視劇中的反派。二話不說,周某衝上去就問你為什麼要加害檢察官?男子莫名其妙,回了一句神經病。周某一聽氣不打一處來,對著男子就是一頓拳打腳踢,嘴裡面還唸叨著,“叫你加害檢察官,我打死你!”隨後,周某趁機逃走。受傷男子立即報警,周某被上海警方上網通緝。", "is_valid": true, "news_type":"百家" }, { "title":"導彈來襲怎麼辦?日本政府呼籲國民墮入地下通道", "img_url":"/static/img/news/03.JPEG", "content":"中新網4月21日電 據日媒報道,日本政府本月21日公佈了彈道導彈可能落在國內時應採取的應對方法,呼籲民眾身處室外時\“儘可能躲入堅固的建築物或地下通道\”等", "is_valid": true, "news_type":"本地" }, { "title":"美監:朝在建能發射3發以上導彈的3000噸級新潛艇", "img_url":"/static/img/news/04.JPEG", "content":"【環球網報道】據韓聯社4月21日報道,美國保守媒體《華盛頓自由燈塔》20日引用聯合國報告報道稱,朝鮮可能對“新浦”級潛艇進行改裝,使其可連發多枚潛射導彈,韓國軍方負責人21日對此表示,需進一步分析,持謹慎態度", "is_valid": true, "news_type":"推薦" }, { "title":"證監會:前發審委員馮小樹違法買賣股票被罰4.99億", "img_url":"/static/img/news/05.png", "content":"證監會新聞發言人張曉軍21日表示,中央第七巡視組對證監會開展專項巡視期間,向證監會移交了前深交所工作人員、曾任股票發審委兼職委員馮小樹涉嫌違法買賣股票的相關線索。會黨委對相關線索高度重視,要求予以徹查。經過調查審理,通過對複雜商業架構的層層剖析,對繁複資金往來情況的抽絲剝繭,證監會查明,馮小樹先後以岳母彭某嫦、配偶之妹何某梅名義入股擬上市公司,並在公司上市後拋售股票獲利鉅額利益,其交易金額累計達到2.51億元,獲利金額達2.48億元", "is_valid": true, "news_type":"百家" }, { "title":"外交部迴應安倍參拜靖國神社:同軍國主義劃清界限", "img_url":"/static/img/news/06.jpg", "content":"新聞圖片", "is_valid": true, "news_type":"推薦" }, { "title":"\"薩德\"供地違法?韓民眾聯名起訴要求撤回供地", "img_url":"/static/img/news/07.jpg", "content":"代理本案的“民主社會律師聚會”主張,韓國《國有財產特例限制法》第4條規定,未遵守該法附表中相關法案的國有財產特例無效,該法案附表中並不包括《駐韓美軍地位協定》或有關履行《駐韓美軍地位協定》的特別法案,因此,韓國政府供地是違反《國有財產特例限制法》向美軍提供國有財產特例。", "is_valid": true, "news_type":"推薦" }, { "title":"金正恩:要由朝鮮民族自己譜寫祖國統一新歷史", "img_url":"/static/img/news/08.JPEG", "content":"3月5日,在朝鮮平壤,青瓦臺國家安保室室長鄭義溶(左)與朝鮮勞動黨委員長金正恩握手。新華社平壤3月6日電 據朝中社6日報道,朝鮮最高領導人金正恩5日會見當天抵朝的韓國特使團,雙方就北南首腦會晤交換意見並達成共識。報道說,金正恩在聽取韓方特使轉達的韓國總統文在寅有關南北首腦會晤的意願後,與韓方交換意見並達成共識,他要求有關部門就此儘快採取相關實際舉措。會見時,文在寅總統特使、青瓦臺國家安保室長鄭義溶向金正恩轉交了文在寅的親筆信。報道說,金正恩與韓方代表團就改善北南關係、保障朝鮮半島和平穩定進行了開誠佈公的交談,還就緩和朝鮮半島軍事緊張狀態、促進北南間多方面對話和接觸、合作與交流交換了意見。金正恩說,要由朝鮮民族自己來齊心協力共同推動北南關係發展、譜寫祖國統一的新歷史,這是朝鮮一貫的原則立場,也是他本人堅定不移的意志。報道說,韓國特使團成員就金正恩向平昌冬奧會派遣高級別代表團等多個大規模代表團、幫助大會取得圓滿成功表示感謝。金正恩說,作為血脈相連的同一民族,共同慶祝民族喜事並互相幫助,這次冬奧會是營造北南和解團結與對話良好氣氛的重要契機。除鄭義溶外,特使團其他成員韓國國家情報院院長徐薰、統一部次官千海成、國家情報院次長金相均和青瓦臺國政狀況室室長尹建永也參加了會見。朝鮮勞動黨中央委員會副委員長金英哲和朝鮮勞動黨中央委員會第一副部長金與正會見時在座。據朝中社報道,金正恩5日為韓國特使團成員舉行了晚宴,金正恩的夫人李雪主,以及金英哲、金與正等參加晚宴。另據韓國媒體報道,韓國總統府青瓦臺發言人金宜謙6日說,5日的會見和晚宴持續4個多小時。特使團將在結束後續會談後,於6日下午返回首爾。青瓦臺訊息人士表示,這次會見成果“不令人失望”,韓朝就包括首腦會晤等事項達成一定程度的一致。", "is_valid": true, "news_type":"百家" } ] )

3.服務端程式碼flask_mongo_news.py

#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


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

app.config['SECRET_KEY'] = '[email protected]#31AD23#2'


# 新聞型別
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())



@app.route('/', methods = ['get'])
def index():
    ''' 首頁 '''
    # return 'ok'
    news_list = News.objects.filter(is_valid = True).all()
    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'])
def admin_add():
    ''' 新增新聞 '''
    form = NewsForm()
    return render_template('admin/add.html', form = form)

@app.route('/admin/do_add/', methods = ['GET','POST'])
def admin_doadd():
    ''' 新增新聞 '''
    form = NewsForm()
    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 admin_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 admin_update(pk):
    ''' 修改新聞 '''
    new_obj = News.objects.get_or_404(pk = pk)
    print(new_obj.title)
    form = NewsForm(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)

表單元素forms.py

from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField, SelectField
from wtforms.validators import DataRequired

class NewsForm(FlaskForm):
    """新聞表單資料驗證"""
    title = StringField(label = '新聞標題', validators = [DataRequired('請輸入標題')],
        description = '請輸入標題',
        render_kw={'required':'required', 'class':'form-control'})
    content = TextAreaField(label = '新聞內容', validators = [DataRequired('請輸入新聞內容')],
        description = '請輸入新聞內容',
        render_kw={'required':'required', 'class':'form-control'})
    news_type = SelectField('新聞型別', choices = [('推薦','推薦'), ('百家', '百家'),('本地','本地'), ('圖片','圖片')])
    img_url = StringField(label='新聞圖片', description='請輸入圖片地址',
        render_kw={'required':'required', 'class':'form-control'})
    submit = SubmitField('提交')

4.前端展示相關頁面

模板home_base.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  
  <link rel="stylesheet" href="{{ url_for('static', filename='bootstrap-3.3.7-dist/css/bootstrap.min.css')}}">
  <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='main.css')}}">
  <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='datatables.min.css')}}">
  <script type="text/javascript" src="{{ url_for('static', filename='jquery-3.3.1.min.js')}}"></script>
  <script type="text/javascript">
        $(document).ready(function() {
            $('#example').DataTable();
        } );
  </script>
  {% block head %}
  <title>首頁</title>
  {% endblock %}
</head>
<body>
<div class="container">
    <h1>新聞列表</h1>
  <nav class="navbar navbar-inverse">
      <!-- 頁面頭部 -->
      <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-menu" aria-expanded="false">
              <span class="sr-only">Toggle navigation</span>
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
          </button>
          
      </div>
      <div id="navbar-menu" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
              <li class="active"><a href="/">首頁</a></li>
              <li><a href="{{url_for('cat', name='推薦')}}">推薦</a></li>
              <li><a href="{{url_for('cat', name='百家')}}">百家</a></li>
              <li><a href="{{url_for('cat', name='本地')}}">本地</a></li>
              <li><a href="{{url_for('cat', name='圖片')}}">圖片</a></li>
          </ul>
      </div>
  </nav>

<!-- 新聞內容部分 -->
{% block content %}
<!-- 內容區域 -->
{% endblock %}

</div>
{% block extrajs %}
<!-- 其他指令碼 -->
{% endblock %}
</body>
</html>

首頁index.html

{% extends 'home_base.html' %}
{% block content%}

<div id="content" class="row-fluid">
        <div class="col-md-12">
        <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th>圖片</th>
                <th>簡介</th>
            </tr>
        </thead>
        <tbody>
        {% for obj in news_list %}
        <tr>
              <td>
              <img width=120 height=60 src="{{ obj.img_url }}" alt="圖片">
              </td>
              <td>
              <p>
                <a href="{{ url_for('detail', pk=obj.id) }}">{{ obj.title }}</a>
                <small>{{ obj.created_at }}</small>
              </p>
              </td>
        </tr>
        {% endfor %}
        </tbody>
        </table>
        </div>
</div>
</div>
{% endblock %}
{% block extrajs %}
<script type="text/javascript" src="{{ url_for('static', filename = 'datatables.min.js')}}"></script>
{% endblock %}

欄目頁cat.html

{% extends 'home_base.html' %}
{% block head%}
<title>{{ name }}</title>
{% endblock %}
{% block content%}

<div id="content" class="row-fluid">
        <div class="col-md-12">
        <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th>圖片</th>
                <th>簡介</th>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <th>Name</th>
                <th>Position</th>
            </tr>
        </tfoot>
        <tbody>
        {% for obj in news_list %}
        <tr>
              <td>
              <img width=120 height=60 src="{{ obj.img_url }}" alt="圖片">
              </td>
              <td>
              <p>
                <a href="{{ url_for('detail', pk=obj.id) }}">{{ obj.title }}</a>
                <small>{{ obj.created_at }}</small>
              </p>
              </td>
        </tr>
        {% endfor %}
        </tbody>
        </table>
        </div>
</div>
</div>
{% endblock %}
{% block extrajs %}
<script type="text/javascript" src="{{ url_for('static', filename = 'datatables.min.js')}}"></script>
{% endblock %}

新聞詳情頁detail.html

{% extends 'home_base.html' %}

  {% block head %}
  <title>新聞詳情</title>
  {% endblock %}
{% block content%}


<div id="content" class="row-fluid">
        <div class="col-md-9">
            <h2
            
           

相關推薦

python操作三大主流資料庫(10)python操作mongodb資料庫mongodb新聞專案實戰

python操作mongodb資料庫④mongodb新聞專案實戰 參考文件:http://flask-mongoengine.readthedocs.io/en/latest/ 目錄: [[email protected] mongodb_version01]# tree -L 3 . ├── f

Python操作三大主流資料庫

第1章 資料庫簡介講解資料庫基本知識,關係型資料庫和非關係型資料庫的對比,非關係型資料庫的分類以及其應用場景,最後介紹MySQL資料庫。第2章 mysql基礎介紹MySQL的安裝及配置,使用Navicat 和 phpMyAdmin 進行圖形化管理資料庫。然後講解SQL基礎,重

python操作三大主流資料庫(12)python操作redis的api框架redis-py簡單使用

#coding:utf-8 import redis class Base(object): def __init__(self): self.r = redis.StrictRedis(host = 'localhost', port=6379, db=0) class St

python操作三大主流資料庫(11)redis的安裝和簡單使用

命令參考文件:http://www.redis.cn/topics/introduction.html 1.安裝及配置官網https://redis.io中文網站:http://www.redis.cnwindows版本下載地址:https://github.com/MSOpenTech/redis/rele

python操作三大主流資料庫(3)python操作mysql③python操作mysql的orm工具sqlaichemy安裝配置和使用...

python操作mysql③python操作mysql的orm工具sqlaichemy安裝配置和使用 手冊地址: http://docs.sqlalchemy.org/en/rel_1_1/orm/index.html 安裝 D:\software\source_tar>pip install S

python三大主流資料庫——MongoDB CRUD操作,使用python操作資料庫

(base) C:\Users\zhaosy>pythonPython 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)] on win32Type "help", "copyright"

python操作三大主流資料庫(8)python操作mongodb資料庫python使用pymongo操作mongodb的增刪改查...

python操作mongodb資料庫②python使用pymongo操作mongodb的增刪改查 文件http://api.mongodb.com/python/current/api/index.htmlhttp://api.mongodb.com/python/current/api/pymongo/co

python連線三大主流資料庫(mysql、redis、mongoDB

python連線mysql 用python操作mysql,你必須知道pymysql 程式碼示意: import pymysql conn = pymysql.connect(host='127.0.0.1', user='root', passwd='

Python+Selenium中級篇之10-Python中的繼承的使用

      本文開始介紹一個面向物件設計領域裡,很常見的一種思想,繼承。繼承有很多好處,常聽到的一句話就是,子類能夠直接使用父類的方法,這樣就可以減少子類程式碼量。其實,在自動化測試框架設計過程中,是

python爬蟲(四)---scrapy框架之騰訊招聘專案實戰

目的:功能就是翻頁請求 步驟:如下 爬取職位名,職位連結等  職位名:  職位詳情連結:  職位類別:  人數:  地點:  釋出時間: 下一步驟:寫爬蟲 :tencent.py檔案寫 方法一: 或者這樣寫

螞蟻課堂-java入門進階主流框架學習到架構與電商專案實戰課程

課程介紹: 《java入門進階主流框架學習到架構與電商專案實戰課程視訊教程》從java入門視訊教程到java架構篇的學習,讓你真正跟隨java大牛一起做專案,搞研究,讓你少走彎路,用最快捷的方式hold住java語言!

【備忘】2018年 java入門進階主流框架學習到架構與電商專案實戰

0001-多執行緒快速入門.zip 0002-多執行緒執行緒安全.zip 0003-多執行緒之間通訊.zip 0004-java併發包與併發佇列.zip 0005-執行緒池原理剖析與鎖的深度化.zip 0006-資料交換格式與反射機制與SpringIOC原理分析.zip 00

Python學習總結筆記(10)-- MySQL資料庫操作之SQLAlchemy使用總結

SQLAlchemy是一個著名的ORM框架,使用ORM操作資料庫,不用去關注SQL語句本身,這樣可以提高開發的效率。同時使用ORM框架雖然可以減少程式碼編寫的消耗,但是可能也會執行很多冗餘的資料庫操作,降低程式的執行效率。不過總的來說,合理利用ORM框架與資料庫

三十五、python學習之Flask框架(七)資料庫:Flask對資料庫的基本操作、常見關係模板、資料庫遷移、綜合案例:圖書管理

補充:   使用SQL_Alchemy定義一個模型類,不可以不指定primary_key=True建立表. 一、資料庫基本操作 1. 資料庫的基本操作(CRUD): 在Flask-SQLAlchemy中,插入、修改、刪除操作,均由資料庫會話管理。

Python面向物件操作使用方法,10年經驗教你!

  在Python中,所有資料型別都可以視為物件,當然也可以自定義物件。自定義的物件資料型別就是面向物件中的類(Class)的概念。 我們以一個例子來說明面向過程和麵向物件在程式流程上的不同之處。 假設我們要處理學生的成績表,為了表示一個學生的成績,面向過程的程式可以用一個dict

python連線MongoDB資料庫方法及增刪改查等操作小結。

Y9   建議安裝MongoDB視覺化工具“Robo 3T”,可以很直觀的看到對MongoDB操作後的資料。 1、‘Robo 3T’的安裝,網上很多途徑可下載,在此分享我使用的版本: 連結:https://pan.baidu.com/s/1EcjmUVkXz1GQeTXy2fMk

資料庫及其python資料庫操作

資料庫 設定mysql的登陸密碼 mysql_secure_installation mysql -uroot -p 資料庫的基本操作語句 show databases ##顯示資料庫 show tables ##顯示資料庫中的表 desc user ##顯示資料庫中表

【Mac系統 + Python + Django】之開發一個釋出會系統【Django模型(二)】 【Mac系統 + Mysql】之安裝Mysql資料庫Python + Mysql】之用pymysql庫連線Mysql資料庫並進行增刪改查操作

上一部分給大家介紹Django的檢視。 接下來繼續來了解Django框架,來看第二部分,此部分是對資料庫的操作。   目錄: 一、設計系統表 二、admin後臺管理 三、基本資料訪問(SQLite資料庫) 四、Django配置MySQL   &

【轉】Python操作MongoDB資料庫

前言 MongoDB GUI 工具 PyMongo(同步) Motor(非同步) 後記 前言 最近這幾天準備介紹一下 Python 與三大資料庫的使用,這是第一篇,首先來介紹 MongoDB 吧,,走起!! MongoDB GUI 工具 首先介紹一款 MongoDB 的 GU

專案實戰】:pythonMongoDB資料庫操作及練習

python:MongoDB資料庫的操作及練習 import pymongo class MongodbConn(object): def __init__(self): self.CONN = pymongo.MongoClient("mongodb:/