期末做品檢查

 這學期的管理信息系統是由杜雲梅老師所教,受益不淺。主要是學習了Python+mysql的web建設技術課程。css

前期,老師進行了理論授課,讓咱們瞭解並理解管理信息,瞭解python語句的使用。讓咱們在博客園這個平臺發佈咱們平時的練習,讓咱們能夠去反覆複習,有什麼忘了的地方也能夠去博客園看。html

中期,開始學習用html元素製做web網頁,觀察經常使用網頁的HTML元素,在實際的應用場景中,用已學的標籤模仿製做。製做本身的導航條,認識css的盒子模型,用div等元素佈局造成html文件。完成了登陸與註冊頁面的html+css+js, 夜間模式的開啓和關閉,製做網站網頁共有元素的父模板html,包括頂部導航,中間區塊劃分,底部導航,底部說明等。彙總相關的樣式造成獨立的css文件,使用 js代碼造成獨立的js文件,造成完整的base.html+css+js。前端

後期,進行flask項目,理解flask項目主程序,使用裝飾器,設置路徑與函數之間的關係。加載靜態文件,父模板的繼承和擴展。鏈接mysql數據庫,建立用戶模型,經過用戶模型,對數據庫進行增刪改查,完成登陸、註冊、發佈評論等功能,繼續對咱們的項目進行完善。python

2、總結Python+Flask+MysqL的web建設技術過程mysql

Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python語言簡潔易讀以及可擴展可嵌入,已經成爲最受歡迎的程序設計語言之一。它簡單易學,速度快,免費開源,可移植。web

Python擁有一個強大的標準庫。Python語言的核心只包含數字、字符串、列表、字典、文件等常見類型和函數。sql

剛開始學習python的時候,以爲它所使用的代碼確實是很簡潔易懂,並且很是重視代碼的規範性,這種強制性的縮進使得代碼更具備可讀性,但同時仍是給不少初學者包括我帶來了困惑。最多見的狀況是tab和空格的混用會致使錯誤,而這是用肉眼沒法分別的。因此常常覺得是語法錯誤而在找了好久的錯誤時才發現只是一個縮進錯了。數據庫

對於python各類庫的使用,咱們仍是很不熟悉的,目前大多數都是老師介紹的,若是咱們要深刻對python語言進行研究,各類庫的瞭解也是必不可少的。對於代碼的練習更是必不可少,其實任何代碼都同樣,都須要大量的練習熟悉,鍛鍊咱們的邏輯思惟,不可能一蹴而就。flask

Flask是一個年輕充滿活力的微框架,有着衆多的擁護者,文檔齊全,社區活躍度高。flask處理一個請求的流程就是,首先根據 URL 決定由那個函數來處理,而後在函數中進行操做,取得所需的數據。再將數據傳給相應的模板文件中,由Jinja2 負責渲染獲得 HTTP 響應內容,而後由Flask返回響應內容。session

from flask import Flask
from flask import render_template, redirect, url_for, request, session
import config
from functools import wraps
# from model import User,Comment,Question
# from exts import db

from sqlalchemy import or_, and_

from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash  # 密碼保護,使用hash方法


app = Flask(__name__)# 建立Flask對象
app.config.from_object(config) # 關聯config.py文件進來
db = SQLAlchemy(app)  # 創建和數據庫的關係映射

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(20), nullable=False)
    _password = db.Column(db.String(200), nullable=False)#內部使用



    @property
    def password(self):  # 定義一個外部使用的密碼
         return self._password

    @password.setter  # 設置密碼加密
    def password(self, row_password):
        self._password = generate_password_hash(row_password)


    def check_password(self, row_password):  # 定義一個反向解密的函數
         result = check_password_hash(self._password, row_password)
         return result


class Question(db.Model):
    __tablename__ = 'question'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    title = db.Column(db.String(225), nullable=False)
    detail = db.Column(db.Text, nullable=False)
    time = db.Column(db.DateTime, default=datetime.now())
    author = db.relationship('User', backref=db.backref('questions'))


class Comment(db.Model):
    __tablename__ = 'comment'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    question_id = db.Column(db.Integer, db.ForeignKey('question.id'))
    time = db.Column(db.DateTime, default=datetime.now())
    detail = db.Column(db.Text, nullable=False)
    question = db.relationship('Question', backref=db.backref('comments', order_by=time.desc)) # order_by=creat_time.desc按時間降序
    author = db.relationship('User', backref=db.backref('comments'))


# 增長數據
# user = User(username='vae', password='5201314')
# db.session.add(user)
# db.session.commit()
# #
# # 查詢數據
# user = User.query.filter(User.username == 'vae').first()
# print(user.username,user.password)
#
# #修改數據
# user.password = '250250'
# db.session.commit()

db.create_all()# 測試是否鏈接成功



# 將數據庫查詢結果傳遞到前端頁面 Question.query.all(),問答排序
@app.route('/')
def index():
    context = {
        'questions': Question.query.order_by('-time').all()
    }
    return render_template('index.html', **context)


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        usern = request.form.get('username')
        passw = request.form.get('password')
        user = User.query.filter(User.username == usern).first()
        if user:
            if user.check_password(passw):
                session['user'] = usern
                session['id'] = user.id
                session.permanent = True
                return redirect(url_for('index'))  # 重定向到首頁
            else:
                return u'password error'
        else:
            return u'username is not existed'


# 定義上下文處理器
@app.context_processor# 上下文處理器,定義變量而後在全部模板中均可以調用,相似idea中的model
def mycontext():
    usern = session.get('user')
    if usern:
        return {'username': usern}# 包裝到username,在全部html模板中可調用
    else:
        return {} # 返回空字典,由於返回結果必須是dict


# 跳轉某頁面以前先進行登陸。定義decorator能夠加強函數功能,裝飾器自己是函數,入參是函數,返回值也是函數
def loginFrist(func):
    @wraps(func)  # 加上wraps,它能夠保留原有函數的__name__,docstring
    def wrappers(*args, **kwargs): # 定義wrapper函數將其返回,用*args, **kwargs把原函數的參數進行傳遞
        if session.get('user'): # 只有通過登錄,session才能記住並get到值
            return func(*args, **kwargs)
        else:
            return redirect(url_for('login'))

    return wrappers

# 跳轉註銷
@app.route('/logout')
def logout():
    session.clear()# 註銷時刪除全部session
    return redirect(url_for('index'))

# 註冊
@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'GET':
        return render_template('register.html')
    else:
        username = request.form.get('username')
        password = request.form.get('password')
        user = User.query.filter(User.username == username).first()# 做查詢,並判斷
        if user:
            return 'username existed'
        else:
            user = User(username=username, password=password) # 將對象接收的數據賦到User類中,即存到數據庫
            db.session.add(user)  # 數據庫操做
            db.session.commit()
            return redirect(url_for('login'))  # 重定向到登陸頁


# 問答頁面
@app.route('/question', methods=['GET', 'POST'])
@loginFrist# 將decorator定義的加強函數放在待加強函數定義的上面
def question():
    if request.method == 'GET':
        return render_template('question.html')
    else:
        title = request.form.get('title')
        detail = request.form.get('detail')
        author_id = User.query.filter(User.username == session.get('user')).first().id
        question = Question(title=title, detail=detail, author_id=author_id)
        db.session.add(question)
        db.session.commit()
    return redirect(url_for('index'))  # 重定向到登陸頁


@app.route('/detail/<question_id>')
def detail(question_id):
    quest = Question.query.filter(Question.id == question_id).first()
    comments = Comment.query.filter(Comment.question_id == question_id).all()
    return render_template('detail.html', ques=quest, comments=comments)


# 讀取前端頁面數據,保存到數據庫中
@app.route('/comment/', methods=['POST'])
@loginFrist
def comment():
    comment = request.form.get('new_comment')
    ques_id = request.form.get('question_id')
    auth_id = User.query.filter(User.username == session.get('user')).first().id
    comm = Comment(author_id=auth_id, question_id=ques_id, detail=comment)
    db.session.add(comm)
    db.session.commit()
    return redirect(url_for('detail', question_id=ques_id))


# 我的中心
@app.route('/usercenter/<user_id>/<tag>')
@loginFrist
def usercenter(user_id, tag):
    user = User.query.filter(User.id == user_id).first()
    context = {
        'user': user
    }
    if tag == '1':
        return render_template('usercenter1.html', **context)
    elif tag == '2':
        return render_template('usercenter2.html', **context)
    else:
        return render_template('usercenter3.html', **context)


# 搜索框帶參數搜素顯示在首頁
@app.route('/search/')
def search():
    qu = request.args.get('q')
    ques = Question.query.filter(
        or_(
            Question.title.contains(qu),
            Question.detail.contains(qu)
        )
    ).order_by('-time')
    return render_template('index.html', questions=ques)


if __name__ == '__main__':
    app.run(debug=True)

  

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息