可能图片和代码有点多 望大伙见谅啊
下面是文件结构
app/main/__init__.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
from flask import Blueprint
main=Blueprint('main',__name__)
from . import views,errors
app/main/error.py
from flask import render_template
from . import main
@main.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@main.errorhandler(500)
def error(e):
return render_template('500.html'), 500
app/main/views.py
from flask import render_template, redirect, session, url_for
from .. import db
from ..models import User
from .forms import NameForm
from . import main
@main.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.name.data).first()
if user is None:
user = User(username=form.name.data)
db.session.add(user)
session['known'] = False
else:
session['known'] = True
session['name'] = form.name.data
form.name.data = ''
return redirect(url_for('index'))
return render_template('index.html', form=form, name=session.get('name'), known=session.get('known', False))
@main.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)
@main.route('/request')
def request_test():
user_agent = request.headers.get('User-Agent')
return '%s' % user_agent
@main.route('/about')
def about():
return 'about'
app/main/forms.py
from flask_wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required
class NameForm(Form):
name = StringField('what is your name', validators=[Required()])
submit = SubmitField('Submit')
app/__init__.py
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
import os
basedir = os.path.abspath(os.path.dirname(__file__))
bootstrap = Bootstrap()
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
bootstrap.init_app(app)
db.init_app(app)
return app
app/models.py
from . import db
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('User', backref='role', lazy='dynamic')
def __repr__(self):
return '<Role %r>' % self.name
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
def __repr__(self):
return '<User %r>' % self.username
config.py
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
MAIL_SERVER = 'smtp.googlemail.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
manage.py
import os
from flask_script import Manager,Shell
from app import create_app
from app.models import User,Role
app = create_app(os.getenv('FLASK_CONFIG' or 'default'))
manager = Manager(app)
@manager.command
def dev():
from livereload import Server
live_server = Server(app.wsgi_app)
live_server.watch('**/*.*')
live_server.serve(open_url=True)
def make_shell_context():
return dict(app=app,db=db,User=User,Role=Role)
manager.add_command("shell",Shell(make_context=make_shell_context))
if __name__ == '__main__':
manager.run()
======
运行之后出现了错误 如下所示
```
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/tornado/web.py", line 1446, in _execute
result = self.prepare()
File "/Library/Python/2.7/site-packages/tornado/web.py", line 2706, in prepare
self.fallback(self.request)
File "/Library/Python/2.7/site-packages/livereload/server.py", line 113, in call
WSGIContainer.environ(request), start_response)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1991, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Library/Python/2.7/site-packages/flask/app.py", line 1574, in handle_exception
return handler(e)
File "/Users/lockeroots/PycharmProjects/flaskr/app/main/errors.py", line 15, in error
return render_template('500.html'), 500
File "/Library/Python/2.7/site-packages/flask/templating.py", line 134, in render_template
context, ctx.app)
File "/Library/Python/2.7/site-packages/flask/templating.py", line 116, in _render
rv = template.render(context)
File "/Library/Python/2.7/site-packages/jinja2/environment.py", line 989, in render
return self.environment.handle_exception(exc_info, True)
File "/Library/Python/2.7/site-packages/jinja2/environment.py", line 754, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/lockeroots/PycharmProjects/flaskr/app/templates/500.html", line 1, in top-level template code
{% extends "base.html" %}
File "/Users/lockeroots/PycharmProjects/flaskr/app/templates/base.html", line 1, in top-level template code
{% extends "bootstrap/base.html" %}
File "/Library/Python/2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html", line 1, in top-level template code
{% block doc -%}
File "/Library/Python/2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html", line 4, in block "doc"
{%- block html %}
File "/Library/Python/2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html", line 20, in block "html"
{% block body -%}
File "/Library/Python/2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html", line 21, in block "body"
{% block navbar %}
File "/Users/lockeroots/PycharmProjects/flaskr/app/templates/base.html", line 17, in block "navbar"
<li><a href='{{ url_for('user',name='lockeroots') }}'>Home</a></li>
File "/Library/Python/2.7/site-packages/flask/helpers.py", line 332, in url_for
return appctx.app.handle_url_build_error(error, endpoint, values)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1811, in handle_url_build_error
reraise(exc_type, exc_value, tb)
File "/Library/Python/2.7/site-packages/flask/helpers.py", line 322, in url_for
force_external=external)
File "/Library/Python/2.7/site-packages/werkzeug/routing.py", line 1758, in build
raise BuildError(endpoint, values, method, self)
BuildError: Could not build url for endpoint 'user' with values ['name']. Did you mean 'main.user' instead?
```
打开首页和127.0.1:5500/user/name就会出现上面一样的错误
但打开127.0.1:5500/about就没问题
搞了半天不知道哪出问题了
能不能不要直译(╯‵□′)╯︵┴─┴!!!
看提示嘛
url_for('main.user', name=xxx)