小编Cho*_*key的帖子

按角色限制对烧瓶视图功能的某些区域的访问?

我写了这个,它似乎工作得很好:

@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)

然而,这并不像我预期的那样工作。我收到闪现的消息,但它并没有像我想象的那样重定向。

所以,两个问题:

  1. 为什么返回的重定向不起作用?
  2. 有没有更好的方法来实现这个功能?

python roles flask

4
推荐指数
1
解决办法
6733
查看次数

如何终止作为服务运行的烧瓶应用程序?

由于可以在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".但是,我已经使服务器成为一个全局变量,它仍然给我同样的错误.

python windows service flask

4
推荐指数
3
解决办法
2万
查看次数

为什么Pytz在纽约和底特律有不同的时区列表?

>>> 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)

python timezone pytz

4
推荐指数
1
解决办法
1151
查看次数

使用 Flask-Principal 角色填​​充 WTForm MultiCheckboxField

我正在为我的 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)

python jinja2 flask wtforms flask-principal

3
推荐指数
1
解决办法
2163
查看次数

Flask App仅返回404,无论其运行方式如何

我似乎无法让我的应用程序在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)

python nginx flask uwsgi

3
推荐指数
1
解决办法
1444
查看次数

For Python中的循环和else语句

我在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)

python jinja2

2
推荐指数
1
解决办法
1504
查看次数

SQLAlchemy会话包含没有session.add()的信息

我只是困惑.我忘了添加

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)

python session sqlalchemy flask

2
推荐指数
1
解决办法
62
查看次数

每个烧瓶视图功能有多个路径是不好的做法吗?

所以基本上我有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)

python flask flask-sqlalchemy flask-wtforms

1
推荐指数
1
解决办法
2774
查看次数