-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
130 lines (118 loc) · 4.2 KB
/
app.py
File metadata and controls
130 lines (118 loc) · 4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 9 14:29:06 2020
@author: jiuyang.wei
"""
import os
import click
import sys
from flask_sqlalchemy import SQLAlchemy
from flask import url_for, escape,Flask,render_template,request,redirect,flash
# ...
app = Flask(__name__)
app.config['SECRET_KEY'] = 'dev'
WIN=sys.platform.startswith('win')
if WIN:
prefix = 'sqlite:///'
else:
prefix = 'sqlite:////'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭对模型修改的监控
app.config['SQLALCHEMY_DATABASE_URI'] = prefix + os.path.join(app.root_path, 'data.db')
db = SQLAlchemy(app)
name = 'vjaor'
@app.cli.command()
@click.option('--drop',is_flag=True,help='Create after drop.')
def initdb(drop):
if drop:
db.drop_all()
db.create_all()
click.echo('Initialized database.')
class User(db.Model):
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(20))
class Movie(db.Model):
id = db.Column(db.Integer,primary_key=True)
title = db.Column(db.String(60))
year = db.Column(db.String(4))
@app.cli.command()
def forge():
db.create_all()
name = 'vajor'
movies = [
{'title': 'My Neighbor Totoro', 'year': '1988'},
{'title': 'Dead Poets Society', 'year': '1989'},
{'title': 'A Perfect World', 'year': '1993'},
{'title': 'Leon', 'year': '1994'},
{'title': 'Mahjong', 'year': '1996'},
{'title': 'Swallowtail Butterfly', 'year': '1996'},
{'title': 'King of Comedy', 'year': '1999'},
{'title': 'Devils on the Doorstep', 'year': '1999'},
{'title': 'WALL-E', 'year': '2008'},
{'title': 'The Pork of Music', 'year': '2012'},
]
user = User(name=name)
db.session.add(user)
for m in movies:
movie = Movie(title=m['title'],year=m['year'])
db.session.add(movie)
db.session.commit()
click.echo('Done.')
@app.context_processor
def inject_user():
user = User.query.first()
return dict(user=user)
@app.route('/',methods=['GET','POST'])
def index():
if request.method == 'POST':
title = request.form.get('title')
year = request.form.get('year')
if not title or not year or len(year) >4 or len(title) > 60:
flash('Invalid input')
return redirect(url_for('index'))
movie =Movie(title=title,year=year)
db.session.add(movie)
db.session.commit()
flash('Item created.')
return redirect(url_for('index'))
user = User.query.first()
movies = Movie.query.all()
return render_template('index.html',user=user,movies=movies)
@app.route('/user/<name>')
def user_page(name):
return 'User: %s' % escape(name)
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'),404
@app.route('/movie/edit/<int:movie_id>',methods=['GET','POST'])
def edit(movie_id):
movie=Movie.query.get_or_404(movie_id)
if request.method =='POST':
title = request.form['title']
year = request.form['year']
if not title or not year or len(year)>4 or len(title)>60:
flash('Invalidi input.')
return redirect(url_for('edit',movie_id=movie_id))
movie.title=title
movie.year=year
db.session.commit()
flash('Item updated.')
return redirect(url_for('index'))
return render_template('edit.html',movie=movie)
@app.route('/movie/delete/<int:movie_id>',methods=['POST'])
def delete(movie_id):
movie = Movie.query.get_or_404(movie_id)
db.session.delete(movie)
db.session.commit()
flash('Item deleted')
return redirect(url_for('index'))
@app.route('/test')
def test_url_for():
# 下面是一些调用示例(请在命令行窗口查看输出的 URL):
print(url_for('index')) # 输出:/
# 注意下面两个调用是如何生成包含 URL 变量的 URL 的
print(url_for('user_page', name='greyli')) # 输出:/user/greyli
print(url_for('user_page', name='peter')) # 输出:/user/peter
print(url_for('test_url_for')) # 输出:/test
# 下面这个调用传入了\多余的关键字参数,它们会被作为查询字符串附加到 URL 后面。
print(url_for('test_url_for', num=2)) # 输出:/test?num=2
return 'Test page'