// $category_id = id категории;
// $manufacturer_id = id производителя
$value = implode(',', $val_str); //(массив id фильтров приводим к 'x,a,b,z.......'
$value_num = count($val_str); // считаем сколько фильтров - чтоб в группе sql указать
$query = "SELECT COUNT(DISTINCT p.product_id) AS total FROM product p
LEFT JOIN product_filter f ON(p.product_id = f.product_id)
LEFT JOIN product_to_category c ON(p.product_id = c.product_id)
WHERE f.filter_id in (". $value .") AND c.category_id = '".(int)$category_id."' AND p.manufacturer_id = '".(int)$manufacturer_id."'
GROUP BY p.product_id having count(f.filter_id) = '".$value_num."'";
$category_id = 1;
$manufacturer_id = 5;
$query = $this->db->query("SELECT DISTINCT f.name, f.filter_group_id FROM ".DB_PREFIX."filter_group_description f
LEFT JOIN ".DB_PREFIX."filter l ON(f.filter_group_id = l.filter_group_id)
LEFT JOIN ".DB_PREFIX."product_filter t ON(l.filter_id = t.filter_id)
LEFT JOIN ".DB_PREFIX."product p ON(t.product_id = p.product_id)
LEFT JOIN ".DB_PREFIX."product_to_category c ON(p.product_id = c.product_id)
WHERE c.category_id = '".(int)$category_id."' AND p.manufacturer_id = '".(int)$manufacturer_id."'");
$category_id = 1;
$manufacturer_id = 5;
$filter_group_id;
$query2 = $this->db->query("SELECT DISTINCT l.filter_id, l.filter_group_id, l.name FROM ".DB_PREFIX."filter_description l
LEFT JOIN ".DB_PREFIX."product_filter t ON(l.filter_id = t.filter_id)
LEFT JOIN ".DB_PREFIX."product p ON(t.product_id = p.product_id)
LEFT JOIN ".DB_PREFIX."product_to_category c ON(p.product_id = c.product_id)
WHERE l.filter_group_id = '" . $filter_group_id ."' AND c.category_id = '".(int)$category_id."' AND p.manufacturer_id = '".(int)$manufacturer_id."'");
echo $key;
$keys = html_entity_decode(str_replace('\u','&#x',$key), ENT_NOQUOTES,'UTF-8');
echo " = ";
echo $keys;
<input name=domain type="text" value="{{ data.domain }}">
<input name=name type="text" value="{{data.name}}">
.......... и так далее..... вьюшка получилась универсальна -
можно хоть сотни input добавлять прямо в шаблоне,
главное чтоб имена были у всех разные
app.route('/setting/', methods=['GET', 'POST', 'DELETE'])
def setting():
if not session.get('logged_in'): # проверяем залогин ли usr
abort(404)
if request.method == 'DELETE': # Если метод HTTP = DELETE удаляем настройки для группы setting
db.session.query(Setting).filter_by(group='setting').delete()
db.session.commit()
return render_template('setting.html')
data = {} #создаем словарь - в нем собираем данные и отправляем обратно в форму (так как разложить data = db.session.query(Setting).all() в шаблоне без переборов у меня не хватило ума... :( , а так по-моему проще )
if request.method == 'POST':
for i in request.form.keys(): # обрабатываем каждый input по отдельности
u = db.session.query(Setting).filter_by(group='setting').filter_by(key=i).first()
if u: # если существует обновляем значением из form
u.value = request.form[i]
data[i] = request.form[i] # добавляем в словарь
else:
db.session.add(Setting(group='setting', key=i, value=request.form[i])) # в противном случае создаем новое поле в базе данных и добавляем обратно в словарь
data[i] = request.form[i]
db.session.commit() # Записать изменения в Базу данных
return render_template('root/setting.html', data=data) # как видите словарь ушел обратно к темплею, в указном выше примере показано как словарь раскладывается....
u = db.session.query(Setting).filter_by(group='setting').all() # Ну а пи простом GET запросе выгружаем все записи по группе, создаем словарь и отправляем на рендринг
for i in u:
data[i.key]=i.value
return render_template('root/setting.html', data=data)
class Setting(db.Model):
id = db.Column(db.Integer,primary_key = True)
group = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
key = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
value = db.Column(db.Text, index = True)
def get_id(self):
return self.id
def __unicode__(self):
return self.id
Соединение было сброшено
Во время загрузки страницы соединение с сервером было сброшено.
user www;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 512;
# multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
#client_body_buffer_size 128k;
#client_max_body_size 500m;
server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip off;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/sites-enabled/*;
}
server {
listen 80;
server_name сайт.ru;
server_tokens off;
client_body_buffer_size 128k;
charset utf8;
client_max_body_size 500m;
root /var/www/web/сайт.ru;
index index.php;
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; }
location /admin { index index.php; }
location / { try_files $uri @opencart; }
location @opencart { rewrite ^/(.+)$ /index.php?_route_=$1 last; }
rewrite ^/sitemap.xml$ /index.php?route=feed/google_sitemap;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
Options +FollowSymlinks
Options -Indexes
<FilesMatch "\.(tpl|ini|log)">
Order deny,allow
Deny from all
</FilesMatch>
RewriteEngine On
RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
..... public function order() { ....
from sqlalchemy.orm import load_only
@app.context_processor
def menu():
articles = Article.query.filter_by(onoff=1).options(load_only("name", "url", "num"))
return dict(articles=articles)
{% for article in articles %}
<li><a href="/{{ article.url }}/">{{ article.article }}</a></li>
{% endfor %}
{% for article in articles %}
<li><a href="/{{ article.url }}/">{{ article.article|safe }}</a></li>
{% endfor %}
Если изменить настройки Apache нельзя, например, хостинг не предоставляет такой возможности, то можно воспользоваться промежуточным приложением WSGI для удаления yourapplication.fcgi из URL.
Настройте .htaccess:<IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi <Files ~ (\.fcgi)> SetHandler fcgid-script Options +FollowSymLinks +ExecCGI </Files> </IfModule> <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ cgi-bin/flask-wrapper.fcgi/$1 [QSA,L] </IfModule>
Теперь настроим flask-wrapper.fcgi:#!/home/profel/python/bin/python # -*- coding: utf-8 -*- import sys, os reload(sys) sys.setdefaultencoding('utf8') sys.path.insert(0, ' /home/profel/site/') from flup.server.fcgi import WSGIServer from app import app class ScriptNameStripper(object): def __init__(self, app): self.app = app def __call__(self, environ, start_response): environ['SCRIPT_NAME'] = '' return self.app(environ, start_response) app = ScriptNameStripper(app) if __name__ == '__main__': WSGIServer(app).run()
import sys, os
reload(sys)
sys.setdefaultencoding('utf8')
# -*- coding: utf-8 -*-
import os
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
from flask.ext.sqlalchemy import SQLAlchemy
from wtforms import form, fields, validators
from flask.ext import admin
from flask.ext.admin.contrib import sqla
from flask.ext.admin import helpers, expose
# Create Flask application
app = Flask(__name__)
# Create dummy secrey key so we can use sessions
app.config['CSRF_ENABLED'] = True
app.config['SECRET_KEY'] = '12345678290244'
#app.config['DEBUG'] = 'True'
app.config['USERNAME'] = 'admin'
app.config['PASSWORD'] = '1234'
# Create in-memory database (база для примера, для авторизации не используется)
app.config['DATABASE_FILE'] = 'db.sqlite'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE']
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
# Create user model (модель для примера, для авторизации не используется).
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(100))
last_name = db.Column(db.String(100))
login = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120))
password = db.Column(db.String(64))
# Отображение в административном интерфейсе
def __unicode__(self):
return self.username
# Define login and registration forms
class LoginForm(form.Form):
login = fields.TextField(validators=[validators.required()])
password = fields.PasswordField(validators=[validators.required()])
def validate_login(self, field):
if app.config['USERNAME'] != self.login.data:
raise validators.ValidationError('Invalid user')
if app.config['PASSWORD'] != self.password.data:
raise validators.ValidationError('Invalid password')
# присудствовало в оригинальном файле при хранение акаунта в базе данных
#def get_user(self):
# return db.session.query(User).filter_by(login=self.login.data).first()
def logged_in():
# в сессии будет храниться информация о том, что пользователь вошёл
return session.get('logged')
# Create customized model view class
class MyModelView(sqla.ModelView):
def is_accessible(self):
return logged_in()
def _handle_view(self, name, **kwargs):
if not logged_in():
# делать редирект в некоторых случаях не стоит
return redirect(url_for('.login_view'))
# Create customized index view class that handles login & registration
class MyAdminIndexView(admin.AdminIndexView):
@expose('/')
def index(self):
if not logged_in():
return redirect(url_for('.login_view'))
return super(MyAdminIndexView, self).index()
@expose('/login/', methods=('GET', 'POST'))
def login_view(self):
# handle user login
form = LoginForm(request.form)
if helpers.validate_form_on_submit(form):
#использовалось в оригинальном фале при авторизацию через базу данных
#user = form.get_user()
#login.login_user(user)
session.update({'logged':True}) # возможно задаю не правильно, подправте если не так!
session.modified = True
if logged_in():
return redirect(url_for('.index'))
link = '<p>Don\'t have an account? <a href="' + url_for('.register_view') + '">Click here to register.</a></p>'
self._template_args['form'] = form
self._template_args['link'] = link
return super(MyAdminIndexView, self).index()
@expose('/logout/')
def logout_view(self):
session.pop('logged', None)
return redirect(url_for('.index'))
# views клиентской части #############################################################
@app.route('/')
def index():
return render_template('index.html')
########################################################################################
# Create admin
admin = admin.Admin(app, 'Админка', index_view=MyAdminIndexView(), base_template='my_master.html')
# Add view
admin.add_view(MyModelView(User, db.session))
if __name__ == '__main__':
# Start app
app.run(debug=True)