我写了这个,它似乎工作得很好:
@app.route('/admin', methods=['GET','POST'])
@login_required
def admin():
if not current_user.role == ROLE_ADMIN:
flash('You do not have access to view this page.')
return redirect(url_for('index'))
...the rest of my code...
Run Code Online (Sandbox Code Playgroud)
在试图简化事情时,因为我不想将这 3 行添加到我希望只对管理员可见的每个区域,我尝试将其放入如下函数中:
def admin_only():
if not current_user.role == ROLE_ADMIN:
flash('You do not have access to view this page.')
return redirect(url_for('index'))
Run Code Online (Sandbox Code Playgroud)
然后放入我的视图函数:
@app.route('/admin', methods=['GET','POST'])
@login_required
def admin():
admin_only()
...the rest of my code....
Run Code Online (Sandbox Code Playgroud)
然而,这并不像我预期的那样工作。我收到闪现的消息,但它并没有像我想象的那样重定向。
所以,两个问题:
由于可以在Windows中运行Python脚本作为服务,我能够将我的烧瓶应用程序作为服务运行吗?如果可能,怎么样?,但是当它停止它我不能.我必须在任务管理器中终止该过程.
这是我的run.py,我通过run.py install变成了一个服务:
from app import app
from multiprocessing import Process
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
class AppServerSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "CCApp"
_svc_display_name_ = "CC App"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.hWaitStop = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
server.terminate()
server.join()
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,''))
self.main()
def main(self):
server = Process(app.run(host = '192.168.1.6'))
server.start()
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
Run Code Online (Sandbox Code Playgroud)
我从这篇文章中得到了这个过程的内容:http://librelist.com/browser/flask/2011/1/10/start-stop-flask/#a235e60dcaebaa1e134271e029f801fe,但遗憾的是它也不起作用.
事件查看器中的日志文件表示未定义全局变量"server".但是,我已经使服务器成为一个全局变量,它仍然给我同样的错误.
>>> pytz.country_timezones['US']
America/New_York
America/Detroit
America/Kentucky/Louisville
America/Kentucky/Monticello
America/Indiana/Indianapolis
America/Indiana/Vincennes
America/Indiana/Winamac
America/Indiana/Marengo
America/Indiana/Petersburg
America/Indiana/Vevay
America/Chicago
America/Indiana/Tell_City
America/Indiana/Knox
America/Menominee
America/North_Dakota/Center
America/North_Dakota/New_Salem
America/North_Dakota/Beulah
America/Denver
America/Boise
America/Phoenix
America/Los_Angeles
America/Metlakatla
America/Anchorage
America/Juneau
America/Sitka
America/Yakutat
America/Nome
America/Adak
Pacific/Honolulu
Run Code Online (Sandbox Code Playgroud)
从我在网上找到的所有内容来看,纽约和底特律时区之间绝对没有区别,包括DST.这只是检查前两个.他们必须有两个理由,对吗?
编辑:扩展我的研究,所有列出的UTC -5的时区都有相同的DST信息,所以现在看起来更加冗余.我可以在东部标准时间删除以下所有内容......这样做有什么问题吗?
(UTC -5:00) New_York
(UTC -5:00) Detroit
(UTC -5:00) Kentucky/Louisville
(UTC -5:00) Kentucky/Monticello
(UTC -5:00) Indiana/Indianapolis
(UTC -5:00) Indiana/Vincennes
(UTC -5:00) Indiana/Winamac
(UTC -5:00) Indiana/Marengo
(UTC -5:00) Indiana/Petersburg
(UTC -5:00) Indiana/Vevay
Run Code Online (Sandbox Code Playgroud) 我正在为我的 Flask 应用程序编辑用户页面,但我似乎无法弄清楚如何像处理其他变量(例如电子邮件)一样呈现用户的当前角色。
这是我的模型、形式和视图:
#Flask-Principal Role Model
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
def __repr__(self):
return '<Role %r>' % (self.name)
#SQLALchemy User Model
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key = True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
first_name = db.Column(db.String(128))
last_name = db.Column(db.String(128))
business_name = db.Column(db.String(128))
active = db.Column(db.Boolean())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
#WTForms User Form
class UserForm(Form):
first_name = StringField('first name', validators= [Required()])
last_name = StringField('last name', …Run Code Online (Sandbox Code Playgroud) 我似乎无法让我的应用程序在uWSGI上正常运行.我通过从命令行运行uWSGI将nginx从等式中取出,它表现出与在nginx上运行时完全相同的行为.
uwsgi -s 0.0.0.0:5050 -w app:app --uid www-data --gid www-data --protocol=http
Run Code Online (Sandbox Code Playgroud)
uwsgi按如下方式处理请求:
[pid:0625|app: 0|req: 1/1] 192.168.1.219 () {34 vars in 737 bytes} [Tue Mar 31 11:10:30 2015] GET /admin => generated 233 bytes in 25 msecs (HTTP/1.1 404) 3 headers in 249 bytes (1 switches on core 0)
Run Code Online (Sandbox Code Playgroud)
我的文件结构如下
/srv/www/cc/app/
static/
templates/
__init__.py
views.py
models.py
forms.py
Run Code Online (Sandbox Code Playgroud)
根据新的证据,它可能是我的应用程序,这是我的init .py文件:
import os
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand
app = …Run Code Online (Sandbox Code Playgroud) 我在jinja2模板框架中为python使用了一些条件for循环.我想知道是否有办法在jinja2之外做同样的事情,类似于:
{% for i in a if i == 1 %}
{{ i }}
{% else %}
no items
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
当我在普通的'蟒蛇'中尝试这个时,它不喜欢它
>>> for i in a if i == 1:
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我希望能做的是这样的:
for i in a if i == 1:
print i
else:
print 'no matches found'
Run Code Online (Sandbox Code Playgroud) 我只是困惑.我忘了添加
db.session.add(newbranch)
到下面的代码,只是为了找出它,不知何故它已经在会话中,因为我运行commit()它工作.
我的研究表明需要添加新项目.好吧,正如你在下面的代码中看到的那样,我正在创建新项目但不添加它们,但它们会被添加.
谁能帮我理解为什么?
从我的观点来看:
newbranch = Branch(
name = newbranch_form.name.data,
account = account)
newbranch_form.populate_assoc(newbranch)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
我的表格中的助手功能:
def populate_assoc(self, branch_obj):
branch_obj.name = self.name.data
for assoc_obj in branch_obj.equipment_assoc:
db.session.delete(assoc_obj)
for eq, mod in zip(self.equipment, self.mod):
new_assoc = A_branch_eq(
equipment_id = eq.data,
branch = branch_obj,
mod = mod.data)
Run Code Online (Sandbox Code Playgroud) 所以基本上我有render_template基于if语句的多个返回,并且它们返回我的jinja2模板响应的不同变量.我相信我可以将这些路径分解为自己的功能(同样我可以将我的模板分解为多个模板(例如edit.html模板而不是{% if editform %}我模板中的模板)),但我喜欢这样的想法任何给定页面的单一视图功能和模板.
在我花更多时间创建其余视图函数之前,我想确保我正在做的事情不会在以后咬我.
代码如下,谢谢!
@app.route('/admin/users/', defaults={'id': None}, methods = ['GET'])
@app.route('/admin/users/<id>', methods = ['GET'])
@app.route('/admin/users/edit/<id>', methods = ['GET', 'POST'])
@login_required
def users(id):
if not current_user.role == ROLE_ADMIN:
flash('You do not have access to view this page.')
return redirect(url_for('index'))
if id:
user = User.query.filter_by(id = id).first()
if 'edit' in request.path:
editform = UserForm()
if editform.validate_on_submit():
user.username = editform.username.data
user.email = editform.email.data
user.role = editform.role.data
db.session.add(user)
db.session.commit()
return redirect('/admin/users/' + str(user.id))
editform.username.data = user.username
editform.email.data = …Run Code Online (Sandbox Code Playgroud)