Web2py - Hızlı Kılavuz
web2pyveritabanı odaklı web uygulamalarını içeren çevik geliştirme için ücretsiz, açık kaynaklı bir web çerçevesi olarak tanımlanır; Python'da yazılmıştır ve Python'da programlanabilir. Tam yığın çerçevedir; gerekli tüm bileşenlerden oluşur, bir geliştiricinin tamamen işlevsel bir web uygulaması oluşturması gerekir.
web2py çerçeve takip eder Model-View-Controller geleneksel kalıpların aksine web uygulamalarını çalıştırma kalıbı.
Modelveriler için mantığı içeren uygulamanın bir parçasıdır. Modeldeki nesneler, veri tabanından veri almak ve depolamak için kullanılır.
Viewuygulamanın bir parçasıdır ve verilerin son kullanıcılara gösterilmesine yardımcı olur. Verilerin görüntüsü Modelden alınır.
Controller, uygulamanın kullanıcı etkileşimini yöneten bir parçasıdır. Kontrolörler bir görünümden verileri okuyabilir, kullanıcı girişini kontrol edebilir ve giriş verilerini belirli modele gönderebilir.
web2pyçerezleri ve oturumları yönetmek için yerleşik bir özelliğe sahiptir. Bir işlem gerçekleştirdikten sonra (SQL açısından), oturum aynı zamanda depolanır.
web2pybelirli eylemlerin tamamlanmasından sonra görevleri planlanan aralıklarla çalıştırma kapasitesine sahiptir. Bu, ile başarılabilirCRON.
web2py - İş akışı
Aşağıda verilen iş akışı şemasına bir göz atın.
İş akışı şeması aşağıda açıklanmıştır.
Models, Views ve Controller bileşenler, kullanıcının web2py uygulamasını oluşturur.
Aynı web2py örneğinde birden fazla uygulama barındırılabilir.
Tarayıcı, HTTP isteğini sunucuya gönderir ve sunucu, Model, Controller ve View gerekli çıktıyı almak için.
Oklar, veritabanı motorları ile iletişimi temsil eder. Veritabanı sorguları ham SQL'de veya web2py Veritabanı Soyutlama Katmanı kullanılarak (sonraki bölümlerde tartışılacaktır) yazılabilir, böyleceweb2py uygulama kodu herhangi bir veritabanı motorundan bağımsızdır.
Model veritabanı ile veritabanı bağlantısı kurar ve Controller. Controller Öte yandan, View verilerin görüntüsünü oluşturmak için.
DispatcherHTTP yanıtında verilen istenen URL'yi denetleyicideki bir işlev çağrısına eşler. İşlevin çıktısı bir dizge veya karma tablo olabilir.
Veriler, View. Kullanıcı bir HTML sayfası talep ederse (varsayılan), veriler bir HTML sayfasına dönüştürülür. Kullanıcı XML'de aynı sayfayı isterse, web2py sözlüğü XML'de işleyebilen bir görünüm bulmaya çalışır.
Web2py'nin desteklenen protokolleri arasında HTML, XML, JSON, RSS, CSV ve RTF bulunur.
Model-Görünüm-Denetleyici
model-view-controller web2py'nin temsili aşağıdaki gibidir -
Modeli
"db.py" is the model:
db = DAL('sqlite://storage.sqlite')
db.define_table(employee, Field('name'), Field(‘phone’))
Modeluygulama verilerinin mantığını içerir. Yukarıdaki şekilde belirtildiği gibi veri tabanına bağlanır. SQLite'ın kullanıldığını ve şurada depolandığını düşünün:storage.sqliteçalışan olarak tanımlanan bir tabloya sahip dosya. Tablo yoksa, web2py ilgili tabloyu oluşturarak yardımcı olur.
Kontrolör
Program "default.py" ... Controller.
def employees():
grid = SQLFORM.grid(db.contact, user_signature = False)
return locals()
İçinde web2pyURL eşleme, işlevlere ve modüllere erişmeye yardımcı olur. Yukarıdaki örnek için, Kontrolör, çalışanlar adı verilen tek bir işlev (veya "eylem") içerir.
Tarafından gerçekleştirilen eylem Controller Yerel bir değişkenler kümesi içeren bir anahtar ve değer kombinasyonu olan bir dize veya bir Python sözlüğü döndürür.
Görünüm
"default/contacts.html" ... View.
{{extend 'layout.html'}}
<h1>Manage My Employees</h1>
{{=grid}}
Verilen örnek için, View ilgili kontrolör işlevi yürütüldükten sonra çıktıyı görüntüler.
bunun amacı ViewHTML biçimindeki sözlükteki değişkenleri oluşturmaktır. View dosya HTML olarak yazılmıştır, ancak Python kodunu {{ and }} sınırlayıcılar.
HTML'ye gömülü kod, sözlükteki Python kodundan oluşur.
Web2py ile başlayın
web2py Windows, UNIX ve Mac OS X gibi tüm büyük işletim sistemleri için ikili paketler halinde gelir.
Web2py'yi yüklemek kolaydır çünkü -
Python yorumlayıcısından oluşur, bu nedenle önceden yüklemenize gerek yoktur. Ayrıca tüm işletim sistemlerinde çalışan bir kaynak kodu sürümü de vardır.
Aşağıdaki bağlantı ikili paketlerden oluşur web2pykullanıcının ihtiyacına göre indirmek için - www.web2py.com
web2pyframework, diğer çerçevelerden farklı olarak ön kurulum gerektirmez. Kullanıcının zip dosyasını indirmesi ve işletim sistemi gereksinimine göre sıkıştırmayı açması gerekir.
web2py framework, çalıştırmak için herhangi bir derleme veya karmaşık kurulum gerektirmeyen tam dinamik bir dil olan Python'da yazılmıştır.
Java veya .net gibi diğer programlama dilleri gibi sanal bir makine kullanır ve geliştiriciler tarafından yazılan kaynak kodunu şeffaf bir şekilde bayt olarak derleyebilir.
İşletim sistemi | Komut |
---|---|
Unix ve Linux (kaynak dağıtımı) | python web2py.py |
OS X (ikili dağıtım) | web2py.app dosyasını aç |
Windows (ikili web2py dağıtımı) | web2py.exe |
Windows (kaynak web2py dağıtımı) | c: /Python27/python.exe web2py.py |
Python, nesne yönelimli ve etkileşimli dilin bir kombinasyonu olarak tanımlanabilir. Açık kaynak kodlu bir yazılımdır. Guido van Rossum, 1980'lerin sonunda python tasarladı.
Python, açık sözdizimi ve okunabilirliği nedeniyle popülerlik kazanan PERL'e (Pratik Çıkarma ve Raporlama Dili) benzer bir dildir.
Python'un başlıca dikkate değer özellikleri aşağıdaki gibidir -
Python'un öğrenmesi nispeten kolay ve taşınabilir olduğu söyleniyor. Açıklamaları, UNIX tabanlı sistemler dahil olmak üzere bir dizi işletim sisteminde kolayca yorumlanabilir,Mac OS, MS-DOS, OS/2ve Windows'un çeşitli sürümleri.
Python, tüm büyük işletim sistemlerinde taşınabilir. Kolay anlaşılır bir sözdizimi kullanır, programları kullanıcı dostu yapar.
Birçok görevi destekleyen geniş bir standart kitaplıkla birlikte gelir.
Yukarıdaki diyagramdan, Python'un komut dosyası yazmanın yanı sıra programlama dilinin bir kombinasyonu olduğu açıkça görülmektedir. Komut dosyası dilleri gibi başka bir program içinde yorumlanırlar.
Python sürümleri
Python, CPython, Jython ve IronPython olarak adlandırılan üç üretim kalitesinde uygulamaya sahiptir. Bunlar aynı zamanda Python sürümleri olarak da adlandırılır.
Classic Python diğer adıyla CPython bir derleyici, yorumlayıcıdır ve standart C dilinde uygulanan yerleşik ve isteğe bağlı genişletme modüllerinden oluşur.
Jython Java Sanal Makinesi (JVM) için bir Python uygulamasıdır.
IronPythonMicrosoft tarafından tasarlanmıştır ve Common Language Runtime (CLR) içerir. Yaygın olarak .NET olarak bilinir.
Başlatma
Herhangi bir işletim sistemindeki temel bir Python programı bir başlık ile başlar. Programlar ile saklanır.py uzantı ve Python komutu programları çalıştırmak için kullanılır.
Örneğin, python_rstprogram.pysize gerekli çıktıyı verecektir. Varsa, hatalar da üretecektir.
Python, kod bloklarını sınırlandırmak için girinti kullanır. Bir blok, iki nokta üst üste ile biten bir satırla başlar ve sonraki satırla benzer veya daha yüksek girintiye sahip benzer tarzda tüm satırlar için devam eder.
# Basic program in Python
print "Welcome to Python!\n"
Programın çıktısı -
Welcome to Python!
Girinti
Python'da programların girintileri oldukça önemlidir. Python'a yeni başlayan geliştiriciler için Python'un girinti kuralları hakkında bazı önyargılar ve efsaneler vardır.
Tüm programcılar için temel kural şudur:
"Whitespace Python kaynak kodunda önemlidir."
Python'un mantıksal bir satırının başında boşluklar ve sekmeler içeren baştaki boşluk, satırın girinti düzeyini hesaplar.
Not
Girinti seviyesi ayrıca ifadelerin gruplandırılmasını da belirler.
Her girinti düzeyi için dört boşluk, yani sekme kullanılması yaygındır.
Sekmeleri boşluklarla karıştırmamak, bu da kafa karışıklığına neden olabilir ve bu görünmezdir.
Python ayrıca girinti eksikliği varsa bir derleme zamanı hatası oluşturur.
IndentationError: expected an indented block
Kontrol Akışı İfadeleri
Bir Python programının kontrol akışı, koşullu ifadeler, döngüler ve işlev çağrıları ile düzenlenir.
If deyimi, belirtilen koşul altında, else ve elif (else-if kombinasyonu) ile birlikte bir kod bloğu yürütür.
For deyimi, bir nesne üzerinde yineler, her bir öğeyi ekli blok tarafından kullanılmak üzere yerel bir değişkene yakalar.
While deyim, koşul altında bir kod bloğu yürütür, True.
Withifadesi, bağlam yöneticisi içinde bir kod bloğu içerir. Daha okunaklı bir alternatif olarak eklendi.try/finally Beyan.
# If statement in Python
x = int(raw_input("Please enter an integer: ")) #Taking input from the user
if x<0:
print "1 - Got a negative expression value"
print x
else:
print "1 - Got a positive expression value"
print x
print "Good bye!"
Çıktı
sh-4.3$ python main.py
Please enter an integer: 4
1 - Got a positive expression value
4
Good bye!
Fonksiyonlar
Tipik bir Python programındaki ifadeler, adı verilen belirli bir formatta düzenlenir ve gruplanır: “Functions". Bir işlev, isteğe bağlı olarak bir eylem gerçekleştiren bir ifade grubudur. Python birçok yerleşik işlev sağlar ve programcıların kendi işlevlerini tanımlamalarına izin verir.
Python'da işlevler, programlama dillerindeki diğer nesneler gibi işlenen değerlerdir.
def ifadesi, bir işlevi tanımlamanın en yaygın yoludur. def aşağıdaki sözdizimine sahip tek cümleli bir bileşik ifadedir -
def function-name (parameters):statement(s)
Aşağıdaki örnek, bir jeneratör işlevini göstermektedir. Nesnelerini benzer şekilde oluşturan yinelenebilir bir nesne olarak kullanılabilir.
def demo ():
for i in range(5):
yield (i*i)
for j in demo():
print j
Çıktı
sh-4.3$ python main.py
0
1
4
9
16
Özel Nitelikler, Yöntemler ve Operatörler
Bir sınıfın çift alt çizgisiyle başlayan öznitelikler, yöntemler ve işleçler genellikle davranış açısından özeldir. Bazıları, özel bir anlam içeren ayrılmış anahtar kelimelerdir.
Bunlardan üçü aşağıda listelenmiştir -
__len__
__getitem__
__setitem__
Diğer özel operatörler arasında __getattr__ ve __setattr__ bulunur, bunlar get ve set sınıfın öznitelikleri.
Dosya G / Ç İşlevleri
Python, belirli dosyaları açmak ve kapatmak için bir işlev içerir. Bu, yardımı ile elde edilebiliropen(), write() ve close() fonksiyonlar.
Dosya giriş ve çıkışına yardımcı olan komutlar aşağıdaki gibidir -
Sr.No | Komut ve İşlevsellik |
---|---|
1 | open() Bir dosyayı veya belgeyi açmaya yardımcı olur |
2 | write() Dosyaya veya belgeye bir dize yazmaya yardımcı olur |
3 | read() Mevcut dosyadaki içeriğin okunmasına yardımcı olur |
4 | close() Bu yöntem, dosya nesnesini kapatır. |
Misal
Adlı bir dosya düşünün “demo.txt”, "Bu bir demo dosyasıdır" metni ile zaten var olan.
#!/usr/bin/python
# Open a file
fo = open("demo.txt", "wb")
fo.write( "Insering new line \n");
# Close opend file
fo.close()
Dosyayı açtıktan sonra kullanılabilecek dize -
This is a demo file
Inserting a new line
web2py, bir geliştirici tarafından bir web uygulamasını tamamen geliştirmek için kullanılabilen tam yığın bir web çerçevesidir. Bir program tasarlamak için SQL veritabanı entegrasyonu ve çok iş parçacıklı web sunucusu içerir.
Bir Kullanıcı Programını Tasarlamak için Web Arayüzü
Komut işletim sistemine göre yürütüldüğünde, web2py bir başlangıç penceresi görüntüler ve ardından kullanıcıdan seçim yapmasını isteyen bir GUI pencere öğesi görüntüler -
- bir kerelik yönetici şifresi,
- web sunucusu için kullanılacak ağ arayüzünün IP adresi,
- ve isteklerin sunulacağı bir bağlantı noktası numarası.
Yönetici, herhangi bir yeni web uygulamasını eklemek ve düzenlemek için tüm yetkiye sahiptir.
Web2py varsayılan olarak web sunucusunu şurada çalıştırır: 127.0.0.1:8000 (localhost üzerinde port 8000), ancak bir kullanıcı gereksinime göre mevcut herhangi bir IP adresi ve portu üzerinde çalıştırabilir.
Web2py GUI gereci aşağıda gösterildiği gibi görüntülenecektir.
Parola, yeni modüldeki herhangi bir değişiklik için yönetici arayüzünde kullanılır.
Kullanıcı yönetim şifresini ayarladıktan sonra, web2py aşağıdaki URL ile sayfada web tarayıcısını başlatır - http://127.0.0.1:8000/
Çerçevenin karşılama sayfası aşağıda gösterildiği gibi görüntülenecektir.
Web2py'de Temel Program Tasarlama
Yukarıda belirtilen URL ile web2py uygulamasını başlattıktan sonra, yeni bir modül oluşturmak için yönetici arayüzünü kullanabiliriz, örneğin, “helloWorld”.
Yönetici, herhangi bir yeni web uygulamasının eklenmesi ve düzenlenmesi için tüm yetkiye sahip olduğundan, yönetici arayüzü kimlik doğrulama amacıyla şifreyi soracaktır.
Yukarıda verilen anlık görüntü, kurulu tüm web2py uygulamalarını listeleyen ve yöneticinin bunları yönetmesine izin veren sayfa ayrıntılarını içerir. Varsayılan olarak, web2py çerçevesi üç uygulama ile birlikte gelir. Onlar -
Bir admin Kullanıcının şu anda uyguladığı uygulama.
Bir examples çevrimiçi etkileşimli belgeler ve web2py resmi web sitesinin bir örneği ile uygulama.
Bir welcomeuygulama. Diğer tüm web2py uygulamaları için temel şablonu içerir. Aynı zamandascaffolding application. Uygulama ayrıca başlangıçta bir kullanıcıyı ağırlıyor.
Yeni uygulamanın adı şöyle olsun “helloWorld”.
Yeni bir uygulama yaratıldığında, kullanıcı ilgili uygulamanın görünümü, modeli ve kontrolörlerinden oluşan bir sayfaya yönlendirilir.
Kullanıcı, aşağıdaki URL'den bahsederek yeni oluşturulan uygulamaya bakabilir - http://127.0.0.1:8000/helloWorld
Varsayılan olarak, bir kullanıcı yukarıda belirtilen URL'ye tıklandığında aşağıdaki ekranı görüntüleyebilir.
Verilen web uygulamasının mesajını yazdırmak için “helloWorld”, değişiklik yapılır default.py denetleyici.
Adlı işlev “index”değeri döndürmek ve gerekli çıktıyı görüntülemek için varsayılan işlevdir. Yukarıda belirtildiği gibi, dize“Hello World- Welcome to my first web application” çıktıyı ekranda görüntüleyen dönüş değeri olarak kullanılır.
Çıktı aşağıdaki gibi görüntülenir -
Geri göndermeler
Form girdisini doğrulama mekanizması çok yaygındır ve bu kadar iyi bir programlama uygulaması olarak görülmez. Giriş, doğrulama için bir yük olan her seferinde doğrulanır.
Web2py'de daha iyi bir model, formları oluşturan aynı eyleme göndermektir. Bu mekanizmaya“postback”web2py'nin ana özelliği budur. Kısacası, kendi kendini teslim etmepostback.
def first():
if request.vars.visitor_name: #if visitor name exists
session.visitor_name = request.vars.visitor_name
redirect(URL('second'))#postback is implemented
return dict()
CRUD Uygulaması
web2py, Oluşturma, geri alma, güncelleme ve silme işlevlerini gerçekleştiren uygulamaları içerir. CRUD döngü, bir veritabanının kalıcı olan temel işlevlerini tanımlar.
Tüm uygulama mantığı, kontrolörler tarafından alınan ve görünüm yardımı ile kullanıcılara gösterilen modellerde yazılır.
appadmin
PHP için, uygulama sunucusu aşağıdaki tüm veritabanlarının listesini içerir: phpmyadmin. Benzer şekilde, web2py, tabloları veya veritabanlarını yönetmek, oluşturmak ve silmek için bir arayüz sağlar.“appadmin.”
Tabloların arkasındaki mantığı uygulamadan önce, veritabanı ve ilişkili tabloların oluşturulması gerekir.
Erişilecek URL appadmin -
http://127.0.0.1:8000/applicationname/appadmin
URL'ye tıklandığında, kullanıcı belirli bir uygulama için ilişkilendirilmiş tabloların listesini alacaktır.
Bu arayüzün halka açık olması amaçlanmamıştır. Veritabanına kolay erişim sağlamak için tasarlanmıştır. İki dosyadan oluşur - bir denetleyici“appadmin.py” ve bir manzara “appadmin.html”.
Bir seferde en fazla 100 kaydı sayfalandırabilir. Kullanımı“appadmin” sonraki bölümlerde tartışılmaktadır.
Komut Satırı Seçenekleri
Önceki bölümde GUI parçacığını kullanarak web2py sunucusunu nasıl başlatacağımızı öğrendik.
Bu widget, sunucuyu şuradan başlatarak atlanabilir. command line Komut istemi.
python web2py.py -a 'şifreniz' -i 127.0.0.1 -p 8000
Web2py sunucusu her başladığında, bir dosya oluşturur "parameters_8000.py"tüm parolaların karma biçimde saklandığı yer.
Ek güvenlik amacıyla aşağıdaki komut satırı kullanılabilir -
python web2py.py -a '<recycle>' -i 127.0.0.1 -p 8000
Yukarıdaki senaryo için, web2py "içinde depolanan karma şifreleri yeniden kullanır"parameters_8000.py".
Durumda, eğer dosya "parameters_8000.py"yanlışlıkla veya başka nedenlerden dolayı silinirse, web tabanlı yönetim arabirimi web2py'de devre dışı bırakılır.
URL Eşleme / Gönderme
Web2py'nin işleyişi, URL'yi belirli bir biçimde eşleyen model görünüm denetleyicisine dayanmaktadır - http://127.0.0.1:8000/a/d/f.html
İşleve kadar yönlendiriyor “f()” denetleyicide bahsedilen d.py"a" adlı uygulama altındadır. Denetleyici uygulamada yoksa web2py adlı varsayılan denetleyici kullanır“default.py”.
URL'de verildiği gibi işlev mevcut değilse, varsayılan işlev çağrılır init()kullanıldı. URL'nin çalışması aşağıdaki resimde şematik olarak gösterilmektedir.
Uzantı .htmlURL için isteğe bağlıdır. Uzantı, uzantısını belirlerViewbu, denetleyicide tanımlanan işlevin çıktısını işler. Aynı içerik html, xml, json, rss vb. Gibi birden çok formatta sunulur.
İstek, argümanları kabul eden ve kullanıcıya uygun çıktıyı veren işlevlere göre iletilir. Kullanıcının ihtiyacına göre çıktı vermek için uygulamanın modeli ve görünümü ile etkileşime giren kontrolördür.
web2py - İş akışı
Web2py'nin iş akışı aşağıda tartışılmaktadır -
Web sunucusu, her bir HTTP isteğini kendi iş parçacığında aynı anda yönetir.
HTTP istek başlığı ayrıştırılır ve dağıtıcıya iletilir.
Dağıtıcı, uygulama isteklerini yönetir ve PATH_INFOişlev çağrısının URL'sinde. Her işlev çağrısı URL'de temsil edilir.
Statik klasöre dahil edilen tüm dosyalara yönelik talepler doğrudan yönetilir ve büyük dosyalar istemciye aktarılır.
Statik bir dosya dışında herhangi bir şey için istekler bir eylemle eşleştirilir.
İstek başlığı, uygulama için bir oturum tanımlama bilgisi içeriyorsa, oturum nesnesi alınır; veya başka bir oturum kimliği oluşturulur.
Eylem dizge olarak bir değer döndürürse, bu istemciye döndürülür.
Eylem yinelenebilir bir döndürürse, verileri istemciye döngüye almak ve yayınlamak için kullanılır.
Koşullu Modeller
Önceki bölümde, Controllers. web2py, uygulamalarının her birinde modeller, görünümler ve denetleyiciler kullanır. Bu nedenle, işlevselliğini de anlamak gerekir.Model.
Diğer MVC uygulamalarının aksine, web2py'deki Modeller koşullu olarak değerlendirilir. Alt klasörlerdeki modeller, denetleyicinin kullanımına göre yürütülür. Bu, aşağıdaki örnekle gösterilebilir -
URL'yi düşünün - http://127.0.0.1:8000/a/d/f.html
Bu durumda, ‘a’ uygulamanın adı, ‘d’ denetleyicinin adı ve f()denetleyiciyle ilişkili işlevdir. Uygulanacak modellerin listesi aşağıdaki gibidir -
applications/a/models/*.py
applications/a/models/d/*.py
applications/a/models/d/f/*.py
Kitaplıklar
web2py, nesneler olarak tüm uygulamalara maruz kalan kitaplıkları içerir. Bu nesneler, "gluon" adlı dizin altındaki çekirdek dosyaların içinde tanımlanır.
DAL şablonu gibi modüllerin çoğunun bağımlılığı yoktur ve web2py çerçevesi dışında uygulanabilir. Aynı zamanda iyi uygulama olarak kabul edilen birim testlerini de sürdürür.
Uygulamalar
web2py uygulamaları şematik bir biçimde aşağıda gösterilmiştir.
Applications web2py'de geliştirilenler aşağıdaki bölümlerden oluşur -
Models - Veri ve veritabanı tablolarını temsil eder.
Controllers - Uygulama mantığını ve iş akışını açıklar.
Views - Verilerin görüntülenmesine yardımcı olur.
Languages - Uygulamadaki dizelerin desteklenen çeşitli dillere nasıl çevrileceğini açıklayın.
Static files - İşlem gerektirmez (örn. Resimler, CSS stil sayfaları vb.).
ABOUT ve README - Projenin detayları.
Errors - Uygulama tarafından oluşturulan hata raporlarını depolar.
Sessions - Her bir kullanıcıyla ilgili bilgileri depolar.
Databases - SQLite veritabanlarını ve ek tablo bilgilerini depolayın.
Cache - Önbelleğe alınmış uygulama öğelerini saklayın.
Modules - Modüller, diğer isteğe bağlı Python modülleridir.
Private - Dahil edilen dosyalara denetleyiciler tarafından erişilir, ancak doğrudan geliştirici tarafından erişilmez.
Uploads - Dosyalara modeller tarafından erişilir, ancak doğrudan geliştirici tarafından erişilmez.
API
Web2py'de, models, controllers ve views geliştiriciler için belirli nesnelerin içe aktarıldığı bir ortamda yürütülür.
Global Objects - istek, yanıt, oturum, önbellek.
Helpers- web2py, programlı olarak HTML oluşturmak için kullanılabilen yardımcı sınıf içerir. Olarak adlandırılan HTML etiketlerine karşılık gelir“HTML helpers”.
Örneğin, A, B, FIELDSET, FORM vb.
Oturum, toplantı, celse
Bir oturum, web uygulaması boyunca kullanıcının etkileşimi boyunca kalıcı olan, sunucu tarafında bilgi deposu olarak tanımlanabilir.
Web2py'deki oturum, depolama sınıfının örneğidir.
Örneğin, bir değişken oturumda şu şekilde saklanabilir:
session.myvariable = "hello"
Bu değer şu şekilde alınabilir:
a = session.myvariable
Değişkenin değeri, kod aynı oturumda aynı kullanıcı tarafından yürütüldüğü sürece alınabilir.
Oturum için web2py'deki önemli yöntemlerden biri “forget” -
session.forget(response);
Web2py'ye oturumu kaydetmemesi talimatını verir.
Görevleri Arka Planda Çalıştırma
Her bir isteği kendi iş parçacığında paralel olarak işleyen web sunucusuna bir HTTP isteği gelir. Aktif olan görev ön planda yer alırken diğerleri arka planda tutulur. Arka plan görevlerini yönetmek de web2py'nin ana özelliklerinden biridir.
Zaman alan görevler tercihen arka planda tutulur. Arka plan görevlerini yöneten mekanizmalardan bazıları aşağıda listelenmiştir -
CRON
Queues
Scheduler
CRON
Web2py'de, CRONGörevi belirli zaman aralıklarında çalıştırma yeteneği verir. Her uygulama, işlevlerini tanımlayan bir CRON dosyası içerir.
Planlayıcı
Yerleşik zamanlayıcı, önceliği ayarlayarak görevlerin arka planda çalıştırılmasına yardımcı olur. Görevleri oluşturmak, zamanlamak ve değiştirmek için bir mekanizma sağlar.
Planlanan olaylar, dosya adı ile modellerde listelenir “scheduler.py”.
Uygulama Oluşturma
Web2py'de modeller ve denetleyiciler oluşturmaya genel bir bakış yaptık. Burada, adlı uygulamanın oluşturulmasına odaklanacağız.“Contacts”. Uygulama, şirketlerin bir listesini ve bu şirketlerde çalışan kişilerin bir listesini tutmalıdır.
Model Oluşturma
Burada veri sözlüğü için tabloların tanımlanması modeldir. Kişiler uygulamasının modeli "models”Klasörler. Dosya şurada saklanır:models/db_contacts.py.
# in file: models/db_custom.py
db.define_table('company', Field('name', notnull = True, unique = True), format = '%(name)s')
db.define_table(
'contact',
Field('name', notnull = True),
Field('company', 'reference company'),
Field('picture', 'upload'),
Field('email', requires = IS_EMAIL()),
Field('phone_number', requires = IS_MATCH('[\d\-\(\) ]+')),
Field('address'),
format = '%(name)s'
)
db.define_table(
'log',
Field('body', 'text', notnull = True),
Field('posted_on', 'datetime'),
Field('contact', 'reference contact')
)
Yukarıdaki dosya oluşturulduktan sonra tablolara URL yardımı ile erişilebilir. http://127.0.0.1:8000/contacts/appadmin
Denetleyicinin Oluşturulması
Controller kişileri listelemek, düzenlemek ve silmek için bazı işlevler içerecektir.
# in file: controllers/default.py
def index():return locals()
def companies():companies = db(db.company).select(orderby = db.company.name)
return locals()
def contacts():company = db.company(request.args(0)) or redirect(URL('companies'))
contacts = db(db.contact.company == company.id).select(orderby = db.contact.name)
return locals()
@auth.requires_login()
def company_create():form = crud.create(db.company, next = 'companies')
return locals()
@auth.requires_login()
def company_edit():company = db.company(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.company, company, next='companies')
return locals()
@auth.requires_login()
def contact_create():db.contact.company.default = request.args(0)
form = crud.create(db.contact, next = 'companies')
return locals()
@auth.requires_login()
def contact_edit():contact = db.contact(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.contact, contact, next = 'companies')
return locals()
def user():return dict(form = auth())
Yaratılışı view çıktısı ile birlikte bir sonraki bölümde tartışılacaktır.
web2py çerçevesi kullanır Models, Controllers ve Viewsuygulamalarında. Biraz değiştirilmiş bir Python sözdizimi içerir.Views uygun Python kullanımına dayatılan herhangi bir kısıtlama olmaksızın daha okunabilir kod için.
Bir web2py'nin temel amacı Viewpython kodunu bir HTML belgesine yerleştirmektir. Ancak, aşağıdaki gibi bazı sorunlarla karşı karşıyadır:
- Bir HTML belgesine gömülü python kodundan kaçış.
- HTML kurallarını etkileyebilecek Python'a dayalı girintiyi takiben.
Sorunlardan kaçmak için web2py, görünüm bölümünde {{..}} sınırlayıcılar kullanır. Sınırlayıcılar, gömülü python kodundan kaçmaya yardımcı olur. Ayrıca HTML girintileme kurallarının izlenmesine de yardımcı olur.
İçinde bulunan kod {{..}}sınırlayıcılar istenmeyen Python kodunu içerir. Python normalde kod bloklarını sınırlamak için girinti kullandığından, sınırlayıcılar içindeki istenmeyen kod uygun şekilde korunmalıdır. Bu sorunun üstesinden gelmek için web2py,“pass” anahtar kelime.
Bir satır ile başlayan kod bloğu, iki nokta üst üste ile biter ve pass ile başlayan bir satır ile biter.
Note - pass bir Python anahtar kelimesidir, bir web2py anahtar kelimesi değildir.
Aşağıdaki kod, pass anahtar kelimesinin uygulamasını gösterir -
{{
if num > 0:
response.write('positive number')
else:
response.write('negative number')
pass
}}
HTML Yardımcıları
web2py, programlı olarak HTML oluşturmak için kullanılabilecek yardımcı sınıf içerir. "HTML yardımcıları" olarak adlandırılan HTML etiketlerine karşılık gelir.
Örneğin -
[(A('Home', _href = URL('default', 'home')), False, None, []), ...]
Buraya, A çapaya karşılık gelen yardımcıdır <a>HTML etiketi. HTML çapasını oluşturur<a> programlı olarak etiketleyin.
HTML yardımcıları iki türden oluşur: positional ve named argümanlar.
Positional bağımsız değişkenler, HTML açma ve kapama etiketleri arasında bulunan nesneler olarak yorumlanır.
Named bağımsız değişkenler bir alt çizgi ile başlar ve HTML etiketi olarak yorumlanır.
Yardımcılar, dizelerin serileştirilmesinde de yararlıdır. _str_ve xml yöntemleri. Örneğin -
>>> print str(DIV(“hello world”))
Çıktı
<div> hello world </div>
Note - HTML yardımcıları, Belge Nesne Modelinin (DOM) sunucu tarafında bir temsilini sağlar.
XML Yardımcıları
XML, öncelenmemesi gereken metni içine alan bir nesne olarak adlandırılır. Metin, geçerli XML içerebilir veya içermeyebilir.
Örneğin, aşağıda belirtilen kod için JavaScript içerebilir.
>>> print XML('<script>alert("unsafe!")</script>')
Çıktı
<script> alert(“unsafe!”)</script>
Yerleşik Yardımcıları
Web2py'de kullanılan birçok yerleşik yardımcı vardır. HTML yerleşik yardımcılarından bazıları aşağıda listelenmiştir.
İsim | Kullanım | Misal |
---|---|---|
Bir | Bu yardımcı, bağlantı oluşturmak için kullanılır. Bağlantı etiketine karşılık gelir | |
B | Bu yardımcı, metnin içeriğini kalınlaştırmaya yardımcı olur. | |
VÜCUT | Bu yardımcı, bir sayfanın gövdesini oluşturur. Ayrıca, kesinti sayısını artırmak için bir çarpma operatörü içerir. | |
KOD | Python, C, C ++ ve web2py kodu için sözdizimi vurgulama gerçekleştirir. Bu yardımcı aynı zamanda bir API belgesini bağlama yeteneğine de sahiptir. | |
ALAN SETİ | Etiketi ile birlikte bir giriş alanı oluşturur. | |
KAFA | Bir HTML sayfasının <head> etiketini etiketlemeye yardımcı olur. | |
IMG | Verilen HTML sayfası için görüntülerin gömülmesine yardımcı olur. | |
Özel Yardımcıları
Bu yardımcılar, etiketleri gereksinimlere göre özelleştirmek için kullanılır. web2py aşağıdaki özel yardımcıları kullanır -
ETİKET
web2py, evrensel etiket oluşturucu olarak TAG kullanır. Özelleştirilmiş XML etiketleri oluşturmaya yardımcı olur. Genel sözdizimi aşağıdaki gibidir -
{{ = TAG.name('a', 'b', _c = 'd')}}
XML kodunu şu şekilde oluşturur: <name c = "d"> ab </name>
TAG bir nesnedir ve TAG.name
veya TAG['name']
geçici bir yardımcı sınıf döndüren bir işlevdir.
MENÜ
Bu yardımcı menü öğelerinin veya menü öğelerinin değerlerinin bir listesini yaparak menüyü temsil eden ağaç benzeri bir yapı oluşturur. Menü öğelerinin listesi şu şekildedir:response.menu. Örneğin -
print MENU([['One', False, 'link1'], ['Two', False, 'link2']])
Çıktı aşağıdaki gibi görüntülenecektir -
<ul class = "web2py-menu web2py-menu-vertical">
<li><a href = "link1">One</a></li>
<li><a href = "link2">Two</a></li>
</ul>
GÜZELLEŞTİRMEK
Listeler ve sözlükler dahil olmak üzere bileşik nesnelerin temsillerini oluşturmaya yardımcı olur. Örneğin,
{{ = BEAUTIFY({"a": ["hello", XML("world")], "b": (1, 2)})}}
Yapıcı bağımsız değişkeninin bir temsiliyle, XML'e serileştirilebilir bir XML nesnesi döndürür. Bu durumda, temsil şu olacaktır:
{"a": ["hello", XML("world")], "b": (1, 2)}
Çıktı şu şekilde oluşturulacaktır:
<table>
<tr>
<td>a</td>
<td>:</td>
<td>hello<br />world</td>
</tr>
<tr>
<td>b</td>
<td>:</td>
<td>1<br />2</td>
</tr>
</table>
Sunucu tarafı DOM Oluşturma
Sunucu tarafı işleme, kullanıcının web2py bileşenlerinin başlangıç durumunu önceden oluşturmasına olanak tanır. Tüm türetilmiş yardımcılar, DOM'u sunucu tarafında oluşturmak için arama öğesi ve öğeleri sağlar.
elementbelirtilen koşulla eşleşen ilk alt öğeyi döndürür. Diğer yandan,elementseşleşen tüm çocukların bir listesini döndürür. Her ikisi de aynı sözdizimini kullanır.
Bu, aşağıdaki örnekle gösterilebilir -
a = DIV(DIV(DIV('a', _id = 'target',_class = 'abc')))
d = a.elements('div#target')
d[0][0] = 'changed'
print a
Çıktı şu şekilde verilir -
<div><div><div id = "target" class = "abc">changed</div></div></div>
Sayfa düzeni
Görünümler, çıktıyı son kullanıcılara göstermek için kullanılır. Diğer görünümleri de kapsayabileceği gibi genişletilebilir. Bu, ağaç benzeri bir yapı uygulayacaktır.
Örnek - “index.html” genişler “layout.html” hangisini içerebilir “menu.html” sırayla içerir “header.html”.
{{extend 'layout.html'}}
<h1>Hello World</h1>
{{include 'page.html'}}
Misal
Önceki bölümlerde şirket modülü için modeller ve kontrolörler oluşturduk. Şimdi, verilerin gösterimini oluşturmaya yardımcı olan görünümün oluşturulmasına odaklanacağız.
Varsayılan olarak, web2py'deki görünümler şunları içerir: layout.html ve index.html, verileri görüntülemenin genel bölümünü tanımlar.
{{extend 'layout.html'}}
<h2>Companies</h2>
<table>
{{for company in companies:}}
<tr>
<td>{{ = A(company.name, _href = URL('contacts', args = company.id))}}</td>
<td>{{ = A('edit', _href = URL('company_edit', args = company.id))}}</td>
</tr>
{{pass}}
<tr>
<td>{{ = A('add company', _href = URL('company_create'))}}</td>
</tr>
</table>
Çıktı aşağıdaki gibi olacaktır -
Database Abstraction Layer (DAL)web2py'nin en büyük gücü olarak kabul edilir. DAL, temel SQL sözdizimine basit bir Uygulama Programlama Arayüzü (API) sunar.
Bu bölümde, etiketlere göre verimli bir şekilde arama yapmak için sorgular oluşturmak ve hiyerarşik bir kategori ağacı oluşturmak gibi DAL'ın önemsiz olmayan uygulamalarını öğreneceğiz.
DAL'ın bazı önemli özellikleri şunlardır:
web2py, Python nesnelerini veritabanı nesnelerine eşleyen bir API olan Veritabanı Soyutlama Katmanı (DAL) içerir. Veritabanı nesneleri sorgular, tablolar ve kayıtlar olabilir.
DAL, veritabanı arka ucu için belirtilen diyalekti kullanarak gerçek zamanlı olarak SQL'i dinamik olarak üretir, böylece bir geliştiricinin eksiksiz SQL sorgusu yazması zorunlu değildir.
DAL kullanmanın en büyük avantajı, uygulamaların farklı veri tabanları ile taşınabilir olmasıdır.
DAL ile Başlarken
Web2py'deki çoğu uygulama bir veritabanı bağlantısı gerektirir. Bu nedenle, veritabanı modelini oluşturmak, bir uygulamanın tasarımında ilk adımdır.
Adlı yeni oluşturulan uygulamayı düşünün “helloWorld”. Veritabanı, uygulamanın Modelleri altında gerçekleştirilir. İlgili uygulama için tüm modeller -models/db_custom.py.
DAL uygulamak için aşağıdaki adımlar kullanılır -
Adım 1 - DAL Oluşturucu
Bir veritabanı bağlantısı kurun. Bu, aynı zamanda DAL kurucusu olarak da adlandırılan DAL nesnesi kullanılarak oluşturulur.
db = DAL ('sqlite://storage.sqlite')
DAL'ın dikkate değer özelliği, aynı veri tabanı ile veya farklı veri tabanları ile, farklı veri tabanı türleri ile bile birden çok bağlantıya izin vermesidir. Bu satırın zaten dosyada olduğu görülüyor.models/db.py. Bu nedenle, silmediğiniz veya farklı bir veritabanına bağlanmanız gerekmediği sürece buna ihtiyacınız olmayabilir. Varsayılan olarak web2py, dosyada depolanan bir SQLite veritabanına bağlanırstorage.sqlite.
Bu dosya, uygulamanın veritabanları klasöründe bulunur. Dosya yoksa, uygulama ilk çalıştırıldığında web2py tarafından oluşturulur.
SQLite hızlıdır ve tüm verileri tek bir dosyada depolar. Bu, verilerinizin bir uygulamadan diğerine kolayca aktarılabileceği anlamına gelir. Aslında, SQLite veritabanı / veritabanları uygulamalarla birlikte web2py tarafından paketlenmiştir. Çeviriler, birleştirmeler ve toplamalar dahil olmak üzere tam SQL desteği sağlar.
SQLite'ın iki dezavantajı vardır.
Birincisi, sütun türlerini zorlamaması ve sütun ekleme ve çıkarma dışında ALTER TABLE olmamasıdır.
Diğer bir dezavantaj, tüm veritabanının yazma erişimi gerektiren herhangi bir işlem tarafından kilitlenmesidir.
Adım 2 - Tablo Oluşturucu
Veritabanı ile bağlantı kurulduktan sonra, define_table yeni tabloları tanımlama yöntemi.
Örneğin -
db.define_table('invoice',Field('name'))
Yukarıdaki yöntem aynı zamanda Tablo yapıcısı arasında da kullanılır. Tablo yapıcısının sözdizimi aynıdır. İlk argüman tablo adıdır ve ardından bir liste gelirField(s). Alan yapıcısı aşağıdaki bağımsız değişkenleri alır -
Sr.No | Argümanlar ve Kullanım |
---|---|
1 | The field name Tablodaki alanın adı. |
2 | The field type dize (varsayılan), metin, boole, tamsayı vb. gibi veri türlerinden herhangi birine sahip değerleri alır. |
3 | Length Maksimum uzunluğu tanımlar. |
4 | default = None Bu, yeni bir kayıt eklendiğinde varsayılan değerdir. |
5 | update = None Bu, varsayılanla aynı şekilde çalışır, ancak değer eklemede değil, yalnızca güncellemede kullanılır. |
6 | Notnull Bu, alan değerinin NULL olup olmadığını belirtir. |
7 | readable = True Bu, alanın formlarda okunabilir olup olmadığını belirtir. |
8 | writable = True Bu, alanın formlara yazılabilir olup olmadığını belirtir. |
9 | label = "Field Name" Bu, formlarda bu alan için kullanılacak etikettir. |
define_table yöntem ayrıca üç adlandırılmış argüman alır -
Sözdizimi
db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
migrate = True - Bu, web2py'ye, eğer yoksa tablo oluşturması veya model tanımına uymuyorsa değiştirmesi talimatını verir.
fake_migrate = False - Model, veritabanı tablo içeriğiyle eşleşiyorsa, fake_migrate = True olarak ayarlayın, bu web2py'nin bir veriyi yeniden oluşturmasına yardımcı olur.
format = '%(id)s' - Bu, verilen tablodaki kayıtların nasıl temsil edilmesi gerektiğini belirleyen bir biçim dizesidir.
Ham SQL Oluşturma
DAL kullanarak, veri tabanına bir bağlantı kurabilir ve tablo yapıcısı ve alan yapıcısını kullanarak yeni tablolar ve alanlarını oluşturabiliriz.
Bazen, gerekli çıktıya uymak için SQL ifadeleri oluşturmak gerekir. web2py, ham SQL oluşturmaya yardımcı olan ve aşağıda verilen çeşitli işlevleri içerir -
_insert
Verilen tablo için insert deyimlerinin alınmasına yardımcı olur. Örneğin,
print db.person._insert(name ='ABC')
"Kişi" adlı tablo için insert deyimini alır.
SQL deyimi çıktısı -
INSERT INTO person(name) VALUES ('ABC');
_Miktar
Kayıt sayısını veren SQL ifadesinin alınmasına yardımcı olur. Örneğin, 'kişi' adlı bir tablo düşünün ve 'ABC' adlı kişilerin sayısını bulmamız gerekiyor.
print db(db.person.name ==' ABC ')._count()
SQL deyimi çıktısı -
SELECT count(*) FROM person WHERE person.name = ' ABC ';
_select
Seçili SQL ifadelerinin alınmasına yardımcı olur. Örneğin, 'kişi' adlı bir tablo düşünün ve 'ABC' adlı kişilerin listesini bulmamız gerekiyor.
print db(db.person.name == ' ABC ')._select()
SQL deyimi çıktısı -
SELECT person.name FROM person WHERE person.name = ' ABC ';
_delete
Getirmeye yardımcı olur delete SQLifadeler. Örneğin, 'kişi' adlı tabloyu düşünün ve 'ABC' adlı ifadeleri silmemiz gerekiyor.
print db(db.person.name == ' ABC ')._delete()
SQL deyimi çıktısı -
DELETE FROM person WHERE person.name = ' ABC ';4
_Güncelleme
Güncellenmiş SQL ifadelerinin alınmasına yardımcı olur. Örneğin, 'kişi' adlı tabloyu düşünün ve bir sütun adını başka bir değerle güncellememiz gerekiyor
print db(db.person.name == ' ABC ')._update()
SQL deyimi çıktısı -
UPDATE person SET WHERE person.name = ’Alex’;
DAL ile ilgili sorunlar (Gotchas)
SQLite
SQLite, sütunları düşürme veya değiştirme desteğinden yoksundur. Tablodan bir alanı silmek, yapılan değişikliklerin web2py'nin farkında olmayacağı için, onu veritabanında aktif tutar.
Bu durumda, fake_migrate = True Bu, meta verilerin yeniden tanımlanmasına yardımcı olacak, böylece değiştirme veya silme gibi herhangi bir değişiklik web2py'nin bilgisi altında tutulacaktır.
SQLite, Boole türlerini desteklemez. Bunun için, web2py dahili olarak Boole'ları 1 karakter dizesiyle eşler, 'T' ve 'F' temsil edertrue ve False sırasıyla.
MySQL
MySQL, ALTER TABLE özelliğini desteklemez. Bu nedenle, veri tabanının taşınması birden fazla işlemi içerir. Parametre ayarlanarak bu durum önlenebilirfake_migrate = True tüm meta verileri kalıcı hale getirecek olan veritabanını tanımlarken.
Oracle
Oracle, kayıtların sayfalandırma özelliğini desteklemez. Ayrıca OFFSET veya limit anahtar kelimeleri için destekten yoksundur. Bunun için web2py, karmaşık üç yollu iç içe geçmiş DAL seçimi yardımıyla sayfalandırmayı başarır. Oracle veritabanı kullanılmışsa, DAL'ın sayfalandırmayı kendi başına ele alması gerekir.
web2py, form oluşturma için güçlü işlevlerle birlikte gelir. Web2py'de formlar oluşturmanın dört farklı yolu aşağıdaki gibidir:
FORM- HTML yardımcıları açısından düşük seviyeli bir uygulama olarak kabul edilir. Bir FORM nesnesi, alan içeriğinin farkındadır.
SQLFORM - Mevcut veri tabanına Oluşturma, Güncelleme ve Silme işlevlerini sağlar.
SQLFORM.factory- SQLFORM'a benzer bir form oluşturan SQLFORM'un üstündeki soyutlama katmanı olarak kabul edilir. Burada yeni bir veritabanı oluşturmaya gerek yoktur.
CRUD Methods - Adından da anlaşılacağı gibi, SQLFORM'a dayalı benzer işlevlere sahip Oluşturma, Alma, Güncelleme ve Silme özellikleri sağlar.
FORM
Kullanıcının girişini kabul eden ve yanıtı göndermek için bir "gönder" düğmesi olan bir uygulama düşünün.
Kontrolör
"Default.py" denetleyicisi aşağıdaki ilişkili işlevi içerecektir
def display_form():
return dict()
Görünüm
İlişkili "default / display_form.html" görünümü, formun görünümünü HTML olarak şu şekilde işleyecektir:
{{extend 'layout.html'}}
<h2>Basic Form</h2>
<form enctype = "multipart/form-data" action = "{{= URL()}}" method = "post">
Your name:
<input name = "name" />
<input type = "submit" />
</form>
<h2>Submitted variables</h2>
{{= BEAUTIFY(request.vars)}}
Yukarıdaki örnek, kullanıcı girdisini isteyen normal HTML biçimidir. FORM nesnesi gibi yardımcılar ile aynı form oluşturulabilir.
Kontrolör
def display_form():
form = FORM('Value:', INPUT(_value = 'name'), INPUT(_type = 'submit'))
return dict(form = form)
"Default.py" denetleyicisindeki yukarıdaki işlev, form oluşturulmasına yardımcı olan FORM nesnesini (HTML yardımcısı) içerir.
Görünüm
{{extend 'layout.html'}}
<h2>Basic form</h2>
{{= form}}
<h2>Submitted variables</h2>
{{= BEAUTIFY(request.vars)}}
İfadenin ürettiği formu {{= form}}FORM nesnesini serileştirir. Bir kullanıcı formu doldurup gönder düğmesini tıkladığında, form kendi kendine gönderir ve değişkenrequest.vars.value giriş değeri ile birlikte alt kısımda görüntülenir.
SQLFORM
Mevcut veritabanına bir form oluşturulmasına yardımcı olur. Uygulanması için adımlar aşağıda tartışılmaktadır.
DAL kullanarak veri tabanı ile bağlantı kurulması, bu aynı zamanda DAL yapıcısı olarak da adlandırılan DAL nesnesi kullanılarak oluşturulur. Bağlantı kurulduktan sonra kullanıcı ilgili tabloyu oluşturabilir.
db = DAL('sqlite://storage.sqlite')
db.define_table('employee', Field('name', requires = IS_NOT_EMPTY()))
Böylelikle “çalışan” adında bir tablo oluşturduk. Denetleyici, formu ve düğmeyi aşağıdaki ifadelerle oluşturur -
form = SQLFORM(
db.mytable,
record = mytable_index,
deletable = True,
submit_button = T('Update')
)
Bu nedenle, oluşturulan çalışan tablosu için kontrolördeki değişiklik şu şekilde olacaktır:
def display_form():
form = SQLFORM(db.person)
İçinde değişiklik yok View. Yeni denetleyicide, SQLFORM yapıcısı db.employee tablosundan bir tane oluşturduğundan, modelde bir FORM oluşturmak gerekir. Yeni form, serileştirildiğinde aşağıdaki gibi görünür -
<form enctype = "multipart/form-data" action = "" method = "post">
<table>
<tr id = "employee_name__row">
<td>
<label id = "person_name__label" for = "person_name">Your name: </label>
</td>
<td>
<input type = "text" class = "string" name = "name" value = "" id = "employee_name" />
</td>
<td></td>
</tr>
<tr id = "submit_record__row">
<td></td>
<td><input value = "Submit" type = "submit" /></td>
<td></td>
</tr>
</table>
<input value = "9038845529" type = "hidden" name = "_formkey" />
<input value = "employee" type = "hidden" name = "_formname" />
</form>
Formdaki tüm etiketlerin tablodan ve alan adından türetilen adları vardır.
Bir SQLFORMnesnesi, yüklenen dosyaları "yüklemeler" klasörüne kaydederek "yükleme" alanlarıyla da ilgilenir. Bu otomatik olarak yapılır. SQLFORM, "Boolean" değerlerini onay kutuları ve metin değerleri şeklinde görüntüler.“textareas”.
SQLFORM ayrıca işlem yöntemini kullanır.Bu, kullanıcı değerleri ilişkili bir SQLFORM ile tutmak istiyorsa gereklidir.
Eğer form.process(keepvalues = True) sonra kabul edilir.
Misal
def display_form():
form = SQLFORM(db.employee)
if form.process().accepted:
response.flash = 'form accepted'
elif form.errors:
response.flash = 'form has errors'
else:
response.flash = 'please fill out the form'
return dict(form = form)
SQLFORM fabrikası
Bazen, kullanıcının, veritabanının uygulanmasına gerek kalmadan var olan bir veritabanı tablosu olacak şekilde bir form oluşturması gerekir. Kullanıcı sadece SQLFORM özelliğinden yararlanmak ister.
Bu, aracılığıyla yapılır form.factory ve bir oturumda tutulur.
def form_from_factory():
form = SQLFORM.factory(
Field('your_name', requires = IS_NOT_EMPTY()),
Field('your_image', 'upload'))
if form.process().accepted:
response.flash = 'form accepted'
session.your_name = form.vars.your_name
session.your_image = form.vars.your_image
elif form.errors:
response.flash = 'form has errors'
return dict(form = form)
Form, alanları adı ve resmi olan SQLFORM gibi görünecek, ancak veritabanında böyle bir tablo yok.
"Default / form_from_factory.html" görünümü şu şekilde temsil edilecektir:
{{extend 'layout.html'}}
{{= form}}
CRUD Yöntemleri
CRUDSQLFORM'un üstünde kullanılan bir API'dir. Adından da anlaşılacağı gibi, uygun formun oluşturulması, geri çağrılması, güncellenmesi ve silinmesi için kullanılır.
CRUD, web2py'deki diğer API'lere kıyasla açığa çıkmaz; bu nedenle ithal edilmesi gerekir.
from gluon.tools import Crud
crud = Crud(db)
Yukarıda tanımlanan CRUD nesnesi aşağıdaki API'yi sağlar -
Sr.No | API ve İşlevsellik |
---|---|
1 | crud.tables() Veritabanında tanımlanan tabloların bir listesini döndürür. |
2 | crud.create(db.tablename) İçin bir oluşturma formu verir table tablename. |
3 | crud.read(db.tablename, id) İçin salt okunur bir form verir tablename ve kayıt kimliği. |
4 | crud.delete(db.tablename, id) kaydı siler |
5 | crud.select(db.tablename, query) Tablodan seçilen kayıtların bir listesini döndürür. |
6 | crud.search(db.tablename) Formun bir arama formu olduğu bir demet (form, kayıtlar) döndürür. |
7 | crud() Request.args () öğesine göre yukarıdakilerden birini döndürür. |
Form Yaratma
Bir form oluşturalım. Aşağıda verilen kodları takip edin.
Modeli
Altında yeni bir model oluşturulur modelsuygulamanın klasörü. Dosyanın adı“dynamic_search.py”.
def build_query(field, op, value):
if op == 'equals':
return field == value
elif op == 'not equal':
return field != value
elif op == 'greater than':
return field > value
elif op == 'less than':
return field < value
elif op == 'starts with':
return field.startswith(value)
elif op == 'ends with':
return field.endswith(value)
elif op == 'contains':
return field.contains(value)
def dynamic_search(table):
tbl = TABLE()
selected = []
ops = ['equals',
'not equal',
'greater than',
'less than',
'starts with',
'ends with',
'contains']
query = table.id > 0
for field in table.fields:
chkval = request.vars.get('chk'+field,None)
txtval = request.vars.get('txt'+field,None)
opval = request.vars.get('op'+field,None)
row = TR(TD(INPUT(_type = "checkbox",_name = "chk"+field,value = chkval == 'on')),
TD(field),TD(SELECT(ops,_name = "op"+field,value = opval)),
TD(INPUT(_type = "text",_name = "txt"+field,_value = txtval)))
tbl.append(row)
if chkval:
if txtval:
query &= build_query(table[field], opval,txtval)
selected.append(table[field])
form = FORM(tbl,INPUT(_type="submit"))
results = db(query).select(*selected)
return form, results
Kontrolör
İlişkili dosya, yani “dynamic_search.py” denetleyiciler bölümü aşağıdaki kodu içerecektir -
def index():
form,results = dynamic_search(db.things)
return dict(form = form,results = results)
Görünüm
Bunu aşağıdaki görünümle oluşturabiliriz.
{{extend 'layout.html'}}
{{= form}}
{{= results}}
İşte göründüğü gibi -
web2py, kullanıcıya e-posta ve SMS gönderme işlevlerini içerir. E-posta ve sms göndermek için kitaplıkları kullanır.
E-postayı Ayarlama
Yerleşik sınıf yani gluon.tools.Mailsınıfı, web2py çerçevesinde e-posta göndermek için kullanılır. Postacı bu sınıfla tanımlanabilir.
from gluon.tools import Mail
mail = Mail()
mail.settings.server = 'smtp.example.com:25'
mail.settings.sender = '[email protected]'
mail.settings.login = 'username:password'
Yukarıdaki örnekte belirtildiği gibi gönderen e-postası, parolayla birlikte her e-posta gönderildiğinde doğrulanacaktır.
Kullanıcının bazı hata ayıklama amacıyla denemesi veya kullanması gerekiyorsa, bu aşağıdaki kod kullanılarak gerçekleştirilebilir.
mail.settings.server = 'logging'
Artık tüm e-postalar gönderilmeyecek ancak konsolda oturum açılacaktır.
Bir e-posta göndermek
Posta nesnesini kullanan bir e-postanın yapılandırma ayarlarını belirledikten sonra, birçok kullanıcıya bir e-posta gönderilebilir.
Tam sözdizimi mail.send() aşağıdaki gibidir -
send(
to, subject = 'Abc',
message = 'None', attachments = [],
cc = [], bcc = [], reply_to = [],
sender = None, encoding = 'utf-8',
raw = True, headers = {}
)
Uygulanması mail.send() aşağıda verilmiştir.
mail.send(
to = ['[email protected]'], subject = 'hello',
reply_to = '[email protected]',
message = 'Hello ! How are you?'
)
MailPostanın son kullanıcı tarafından alındığı posta sunucusunun yanıtına bağlı olarak bir Boole ifadesi döndürür. DönerTrue kullanıcıya bir e-posta göndermeyi başarırsa.
Öznitelikleri, cc ve bcc postanın gönderilmesi amaçlanan geçerli e-posta adreslerinin listesini içerir.
SMS gönderme
SMS mesajları gönderme uygulaması, mesajları alıcıya iletebilen üçüncü taraf hizmeti gerektireceğinden web2py çerçevesinde e-posta göndermekten farklıdır. Üçüncü taraf hizmeti ücretsiz bir hizmet değildir ve açıkça coğrafi bölgeye (ülkeden ülkeye) göre farklılık gösterecektir.
web2py, aşağıdaki işlemle SMS göndermeye yardımcı olmak için bir modül kullanır -
from gluon.contrib.sms_utils
import SMSCODES, sms_email
email = sms_email('1 (111) 111-1111','T-Mobile USA (abc)')
mail.send(to = email, subject = 'test', message = 'test')
Yukarıdaki örnekte, SMSCODES web2py tarafından sağlanan ve büyük telefon şirketlerinin adlarını postfix e-posta adresiyle eşleyen sözlüktür.
Telefon şirketleri genellikle üçüncü taraf hizmetlerinden gelen e-postaları spam olarak ele alır. Daha iyi bir yöntem, telefon şirketlerinin SMS'i kendilerinin iletmesidir. Her telefon şirketi, deposunda bulunan her cep telefonu numarası için benzersiz bir e-posta adresi içerir ve SMS doğrudan e-postaya gönderilebilir.
Yukarıdaki örnekte,
sms_email işlevi, telefonun e-posta adresini döndüren bir telefon numarasını (dize olarak) alır.
İskele uygulaması birkaç dosya içerir. Bunlardan biri, dördü içe aktaran modeller / db.py'dir.
Sınıflar gluon.tools posta kitaplıklarını da içerir ve çeşitli genel nesneleri tanımlar.
İskele uygulaması aynı zamanda auth nesnesi için gerekli olan tabloları da tanımlar, örneğin db.auth_user. Varsayılan iskele uygulaması, modüler olmayacak şekilde dosya sayısını en aza indirecek şekilde tasarlanmıştır. Özellikle model dosyası,db.py, bir üretim ortamında en iyi şekilde ayrı dosyalarda saklanan yapılandırmayı içerir.
Burada bir yapılandırma dosyası oluşturmanızı öneririz -
from gluon.storage import Storage
settings = Storage()
settings.production = False
if
settings.production:
settings.db_uri = 'sqlite://production.sqlite'
settings.migrate = False
else:
settings.db_uri = 'sqlite://development.sqlite'
settings.migrate = True
settings.title = request.
settings.subtitle = 'write something here'
settings.author = 'you'
settings.author_email = '[email protected]'
settings.keywords = ''
settings.description = ''
settings.layout_theme = 'Default'
settings.security_key = 'a098c897-724b-4e05-b2d8-8ee993385ae6'
settings.email_server = 'localhost'
settings.email_sender = '[email protected]'
settings.email_login = ''
settings.login_method = 'local'
settings.login_config = ''
Doğrulama
Hemen hemen her uygulamanın, kullanıcıların kimliğini doğrulayabilmesi ve izinleri ayarlayabilmesi gerekir. web2py, kapsamlı ve özelleştirilebilir bir rol tabanlı erişim denetimiyle birlikte gelirmechanism.web2py. Ayrıca CAS, OpenID, OAuth 1.0, LDAP, PAM, X509 ve çok daha fazlası gibi protokolleri de destekler.
web2py, sistem erişimini yetkili kullanıcılara kısıtlama yaklaşımı olan Rol Tabanlı Erişim Kontrol mekanizması (RBAC) olarak bilinen bir mekanizma içerir. RBAC uygulayan web2py sınıfına Auth adı verilir.
Aşağıda verilen şemaya bakın.
Auth aşağıdaki tabloları tanımlar -
Sr.No | Tablo Adı ve Açıklaması |
---|---|
1 | auth_user kullanıcıların adını, e-posta adresini, şifresini ve durumunu saklar. |
2 | auth_group kullanıcılar için grupları veya rolleri çoktan çoğa bir yapıda depolar |
3 | auth_membership Bağlantı kullanıcılarının ve grupların bilgilerini çoktan çoğa yapıda depolar |
4 | auth_permission Tablo, grupları ve izinleri birbirine bağlar. |
5 | auth_event diğer tablolardaki değişiklikleri ve başarılı erişimi günlüğe kaydeder |
6 | auth_cas Merkezi Kimlik Doğrulama Hizmeti için kullanılır |
Kimlik Doğrulamasını Özelleştirme
Kimlik Doğrulamayı özelleştirmenin iki yolu vardır.
Bir özel tanımlamak için db.auth_user sıfırdan tablo.
Web2py'nin auth tablo.
Şimdi, son tanımlama yöntemine bakalım. authtablo. İçindedb.py model, aşağıdaki satırı değiştirin -
auth.define_tables()
Aşağıdaki kodla değiştirin -
auth.settings.extra_fields['auth_user'] = [
Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}')),
Field('address','text')
]
auth.define_tables(username = True)
Varsayım, her kullanıcının telefon numarası, kullanıcı adı ve adresten oluşmasıdır.
auth.settings.extra_fieldsfazladan alanlar içeren bir sözlüktür. Anahtar, fazladan alanların ekleneceği kimlik doğrulama tablosunun adıdır. Değer, fazladan alanların bir listesidir. Buraya iki ekstra alan ekledik,phone_number and address.
usernameNormalde e-posta alanına dayalı olan kimlik doğrulama sürecine dahil olduğu için özel bir şekilde ele alınmalıdır. Kullanıcı adı argümanını aşağıdaki satıra ileterek, web2py'ye kullanıcı adı alanını istediğimiz ve bunu e-posta alanı yerine giriş yapmak için kullanmak istediğimiz bildirilir. Birincil anahtar gibi davranır.
auth.define_tables(username = True)
Kullanıcı adı benzersiz bir değer olarak kabul edilir. Kaydın normal kayıt formu dışında gerçekleştiği durumlar olabilir. Aynı zamanda, yeni kullanıcının kaydını tamamlamak için oturum açmaya zorlanır.
Bu, sahte bir alan kullanılarak yapılabilir, complete_registration bu ayarlanmış False varsayılan olarak ve şu şekilde ayarlanmıştır: True profillerini güncellediklerinde.
auth.settings.extra_fields['auth_user'] = [
Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}'),
comment = "i.e. 123-123-1234"),
Field('address','text'),
Field('complete_registration',default = False,update = True,
writable = False, readable = False)
]
auth.define_tables(username = True)
Bu senaryo, yeni kullanıcıların oturum açtıktan sonra kayıtlarını tamamlamasını amaçlayabilir.
İçinde db.py, modeller klasörüne aşağıdaki kodu ekleyebiliriz -
if auth.user and not auth.user.complete_registration:
if not (request.controller,request.function) == ('default','user'):
redirect(URL('default','user/profile'))
Bu, yeni kullanıcıları gereksinimlere göre profillerini düzenlemeye zorlar.
yetki
Kullanıcılara bir miktar erişim izni verme veya bir şeye izin verme sürecidir.
Web2py'de yeni kullanıcı oluşturulduktan veya kaydedildikten sonra, kullanıcıyı içermek için yeni bir grup oluşturulur. Yeni kullanıcının rolü geleneksel olarak şu şekilde adlandırılır:“user_[id]” id, kullanıcının benzersiz kimliğidir.
Yeni grubun oluşturulması için varsayılan değer -
auth.settings.create_user_groups = "user_%(id)s"
Kullanıcılar arasında grupların oluşturulması şu şekilde devre dışı bırakılabilir -
auth.settings.create_user_groups = None
Oluşturma, belirli üyelere erişim sağlama ve izinler, appadmin yardımıyla programlı olarak da gerçekleştirilebilir.
Uygulamalardan bazıları aşağıda listelenmiştir -
Sr.No | Komut ve Kullanım |
---|---|
1 | auth.add_group('role', 'description') yeni oluşturulan grubun kimliğini döndürür. |
2 | auth.del_group(group_id) Grubu belirtilen kimliğe sahip siler |
3 | auth.del_group(auth.id_group('user_7')) Verilen kimliğe sahip kullanıcı grubunu siler. |
4 | auth.user_group(user_id) Belirli bir kullanıcı için benzersiz şekilde ilişkilendirilmiş grubun kimliğinin değerini döndürür. |
5 | auth.add_membership(group_id, user_id) Verilen group_id için user_id değerini döndürür |
6 | auth.del_membership(group_id, user_id) Verilen üye kimliğinin, yani kullanıcı kimliğinin verilen gruptan erişimini iptal eder. |
7 | auth.has_membership(group_id, user_id, role) User_id'nin verilen gruba ait olup olmadığını kontrol eder. |
Merkezi Kimlik Doğrulama Hizmeti (CAS)
web2py, hem istemci hem de sunucu yerleşik web2py için İstemci Kimlik Doğrulama Hizmeti - CAS adlı bir endüstri standardı sağlar. Üçüncü taraf bir kimlik doğrulama aracıdır.
Dağıtılmış kimlik doğrulama için açık bir protokoldür. CAS'ın çalışması aşağıdaki gibidir -
Kullanıcı web sitesini ziyaret ederse, protokol kullanıcının kimliğinin doğrulanmış olup olmadığını kontrol eder.
Kullanıcının uygulama için kimliği doğrulanmamışsa, protokol, kullanıcının uygulamaya kaydolabileceği veya oturum açabileceği sayfaya yönlendirir.
Kayıt tamamlanırsa, kullanıcı bir e-posta alır. Kullanıcı e-postayı doğrulayana kadar kayıt tamamlanmaz.
Başarılı kayıttan sonra, kullanıcı CAS cihazı tarafından kullanılan anahtarla doğrulanır.
Anahtar, arka planda ayarlanan HTTP isteği aracılığıyla kullanıcının kimlik bilgilerini almak için kullanılır.
web2py, XML, JSON, RSS, CSV, XMLRPC, JSONRPC, AMFRPC ve SOAP gibi çeşitli protokoller için destek sağlar. Bu protokollerin her biri çeşitli şekillerde desteklenir ve aşağıdakiler arasında bir ayrım yaparız -
- Bir işlevin çıktısını belirli bir biçimde işleme.
- Uzaktan Prosedür Çağrıları.
Sözlük Oluşturmak
Oturum sayısını koruyan aşağıdaki kodu göz önünde bulundurun.
def count():
session.counter = (session.counter or 0) + 1
return dict(counter = session.counter, now = request.now)
Yukarıdaki işlev, kullanıcı sayfayı ziyaret ettikçe ve ziyaret ettiğinde sayıların sayısını artırır. Verilen işlevin şu şekilde tanımlandığını varsayalım:“default.py”web2py uygulamasının denetleyicisi. Sayfa aşağıdaki URL ile talep edilebilir -http://127.0.0.1:8000/app/default/count
web2py, yukarıdaki sayfayı farklı protokollerde ve URL'ye uzantı ekleyerek, örneğin -
http://127.0.0.1:8000/app/default/count.html
http://127.0.0.1:8000/app/default/count.xml
http://127.0.0.1:8000/app/default/count.json
Yukarıdaki eylem tarafından döndürülen sözlük HTML, XML ve JSON'da oluşturulacaktır.
Uzaktan Prosedür Çağrıları
web2py çerçevesi, bir işlevi bir web hizmetine dönüştüren bir mekanizma sağlar. Burada açıklanan mekanizma, daha önce açıklanan mekanizmadan farklıdır çünkü -
- Fonksiyona argümanların dahil edilmesi.
- İşlev bir modelde tanımlanmalıdır.
- Daha katı bir URL adlandırma kuralı uygular.
- Sabit bir protokol seti için çalışır ve kolayca genişletilebilir.
- Bu özelliği kullanmak için bir hizmet nesnesini içe aktarmak ve başlatmak gerekir.
Bu mekanizmayı uygulamak için önce bir hizmet nesnesini içe aktarmalı ve başlatmalısınız.
from gluon.tools import Service
service = Service()
Bu, "db.py" iskele uygulamasında model dosyası. Db.py model, kullanıcılara istenen çıktıyı elde etmek için veritabanı ve denetleyici ile etkileşime giren web2py çerçevesindeki varsayılan modeldir.
Uygulandıktan sonra, modeldeki hizmete kontrolörlerden istenildiği zaman ve gerektiği zaman erişilebilir.
Aşağıdaki örnek, web hizmetlerini ve daha fazlasını kullanan uzaktan prosedür çağrılarının çeşitli uygulamalarını gösterir.
Ağ hizmetleri
Web Hizmetleri, XML, SOAP, WSDL ve UDDI gibi protokolleri kullanarak Web tabanlı uygulamaları entegre etmenin standart bir yolu olarak tanımlanabilir.
web2py çoğunu destekler, ancak entegrasyon oldukça karmaşık olacaktır.
JQuery ile bir web2py JSON hizmeti kullanma
JSON formunu web2py'ye döndürmenin birçok yolu vardır, ancak burada bir JSON hizmeti durumunu ele alıyoruz. Örneğin -
def consumer():return dict()@service.json
def get_days():return ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"]
def call():return service()
Burada şunu görüyoruz -
işlev görünümü oluşturmak için yalnızca boş bir sözlük döndürür ve bu da hizmeti tüketir.
get_days hizmeti tanımlar ve işlev çağrısı tüm kayıtlı hizmetleri gösterir.
get_days denetleyicide olması gerekmez ve bir modelde olabilir.
call her zaman default.py iskele denetleyicisindedir.
Tüketici eylemleri ile görüş aşağıdaki gibidir -
{{extend 'layout.html'}}
<div id = "target"></div>
<script>
jQuery.getJSON("{{= URL('call',args = ['json','get_days'])}}",
function(msg){
jQuery.each(msg, function(){ jQuery("#target").
append(this + "<br />"); } )
}
);
</script>
İlk argüman jQuery.getJSON aşağıdaki hizmetin URL'sidir - http://127.0.0.1:8000/app/default/call/json/get_days
Bu her zaman kalıbı takip eder -
http://<domain>/<app>/<controller>/call/<type>/<service>
URL ikisinin arasında {{...}}çünkü diğer her şey istemci tarafında yürütülürken sunucu tarafında çözülür. İkinci argümanjQuery.getJSON JSON yanıtından geçecek bir geri aramadır.
Bu durumda, geri çağırma yanıttaki her bir öğe üzerinde döngüler (dizeler olarak hafta günlerinin listesi) ve her dizeyi, ardından bir <br/> için <div id = "target">.
Bu şekilde web2py, web hizmetlerinin uygulanmasını jQuery.getJSON.
Bu bölümde, entegrasyon örneklerini tartışacağız. jQuery ile eklentiler web2py. Bu eklentiler, formları ve tabloları kullanıcı için daha etkileşimli ve kullanıcı dostu hale getirmeye yardımcı olur, böylece uygulamanızın kullanılabilirliğini artırır.
Özellikle öğreneceğiz
etkileşimli ekleme seçeneği düğmesiyle çoklu seçim açılır menüsünün nasıl iyileştirileceği,
giriş alanı kaydırıcıyla nasıl değiştirilir ve
tablo veriler nasıl görüntülenir jqGrid ve WebGrid.
Web2py bir sunucu tarafı geliştirme bileşeni olmasına rağmen, welcome iskele uygulaması tabanı içerir jQuerykütüphane. Bu iskele web2py uygulaması "karşılama" adlı bir dosya içerirviews/web2py_ajax.html.
Görünümün içeriği aşağıdaki gibidir -
<script type = "text/javascript"><!--
// These variables are used by the web2py_ajax_init function in web2py_ajax.js
(which is loaded below).
var w2p_ajax_confirm_message = "{{= T('Are you sure you want to delete this object?')}}";
var w2p_ajax_disable_with_message = "{{= T('Working...')}}";
var w2p_ajax_date_format = "{{= T('%Y-%m-%d')}}";
var w2p_ajax_datetime_format = "{{= T('%Y-%m-%d %H:%M:%S')}}";
var ajax_error_500 = '{{=T.M('An error occured, please [[reload %s]] the page') %
URL(args = request.args, vars = request.get_vars) }}'
//--></script>
{{
response.files.insert(0,URL('static','js/jquery.js'))
response.files.insert(1,URL('static','css/calendar.css'))
response.files.insert(2,URL('static','js/calendar.js'))
response.files.insert(3,URL('static','js/web2py.js'))
response.include_meta()
response.include_files()
}}
Dosya, JavaScript ve AJAX uygulamasının uygulanmasından oluşur. web2py, kullanıcının Prototype, ExtJS gibi diğer AJAX kitaplıklarını kullanmasını engeller, çünkü bu tür kitaplıkları uygulamanın daha kolay olduğu her zaman gözlemlenir.
JQuery Etkileri
Varsayılan render <select multiple = "true">..</select>özellikle bitişik olmayan seçeneklerin seçilmesi gerektiğinde, kullanımının o kadar sezgisel olmadığı düşünülmektedir. Bu bir HTML eksikliği olarak adlandırılamaz, ancak çoğu tarayıcının zayıf bir tasarımıdır. Çoklu seçimin sunumunun üzerine JavaScript kullanılarak yazılabilir. Bu, adı verilen jQuery eklentisi kullanılarak uygulanabilir.jquery.multiselect.js.
Bunun için bir kullanıcı eklentiyi indirmelidir jquery.muliselect.js itibaren http://abeautifulsite.net/2008/04/jquery-multiselect, ve ilgili dosyaları içine yerleştirin static/js/jquery.multiselect.js ve static/css/jquery.multiselect.css.
Misal
Aşağıdaki kod, ilgili görünüme eklenmelidir. {{extend ‘layout.html’}}
{{
response.files.append('https://ajax.googleapis.com/ajax\
/libs/jqueryui/1.8.9/jquery-ui.js')
response.files.append('https://ajax.googleapis.com/ajax\
/libs/jqueryui/1.8.9/themes/ui-darkness/jquery-ui.css')
response.files.append(URL('static','js/jquery.multiSelect.js'))
response.files.append(URL('static','css/jquery.\multiSelect.css'))
}}
Aşağıdakileri sonrasına yerleştirin {{extend 'layout.html'}} -
<script>
jQuery(document).ready(function(){jQuery('[multiple]').multiSelect();});
</script>
Bu modaya yardımcı olacak multiselect verilen form için
Kontrolör
def index():
is_fruits = IS_IN_SET(['Apples','Oranges','Bananas','Kiwis','Lemons'], multiple = True)
form = SQLFORM.factory(Field('fruits','list:string', requires = is_fruits))
if form.accepts(request,session):response.flash = 'Yummy!'
return dict(form = form)
Bu eylem aşağıdaki görünümle denenebilir -
{{
response.files.append('https://ajax.googleapis.com/ajax\
/libs/jqueryui/1.8.9/jquery-ui.js')
response.files.append('https://ajax.googleapis.com/ajax\
/libs/jqueryui/1.8.9/themes/ui-darkness/jquery-ui.css')
response.files.append(URL('static','js/jquery.multiSelect.js'))
response.files.append(URL('static','css/jquery.\multiSelect.css'))
}}
{{extend 'layout.html}}
<script>
jQuery(document).ready(function(){jQuery('[multiple]'). multiSelect();});
</script>
{{= form}}
Çıktının ekran görüntüsü aşağıdaki gibidir -
Yararlı Jquery olaylarından bazıları aşağıdaki tabloda listelenmiştir -
Sr.No. | Etkinlik ve Kullanım |
---|---|
1 | onchange eleman değiştiğinde çalıştırılacak |
2 | onsubmit form gönderildiğinde çalıştırılacak |
3 | onselect öğe seçildiğinde çalıştırılacak |
4 | onblur öğe odağı kaybettiğinde çalıştırılacak |
5 | onfocus öğe odaklandığında çalıştırılacak |
JQuery ve Ajax-jqGrid
jqGrid, tablo şeklindeki verileri temsil etmek ve işlemek için bir çözüm sağlayan, jQuery üzerine kurulmuş, Ajax özellikli bir JavaScript denetimidir. jqGrid bir istemci tarafı çözümdür ve verileri Ajax geri aramaları aracılığıyla dinamik olarak yükler, böylece sayfalandırma, arama açılır penceresi, satır içi düzenleme vb. sağlar.
jqGrid, PluginWiki'ye entegre edilmiştir, ancak burada, eklentiyi kullanmayan web2py programları için bağımsız olarak tartışıyoruz. jqGrid kendine ait bir kitabı hak ediyor ancak burada sadece temel özelliklerini ve en basit entegrasyonunu tartışacağız.
JqGrid'in sözdizimi aşağıdaki gibi olacaktır -
def JQGRID(
table, fieldname = None,
fieldvalue = None, col_widths = [],
colnames = [], _id = None, fields = [],
col_width = 80, width = 700,
height = 300, dbname = 'db'
):
Bir bileşen, bir web sayfasının bağımsız olarak çalışan işlevsel kısmı olarak tanımlanır. Bir web sayfasına gömülü modüller, denetleyiciler ve görünümlerden oluşabilir. Bir uygulamadaki bileşen yerelleştirilmiş etiket olmalıdır ve performans modülden bağımsız olarak kabul edilir.
Web2py'de ana odak, sayfaya yüklenen ve bileşen denetleyiciyle AJAX aracılığıyla iletişim kuran bileşenleri kullanmaktır.
web2py, LOAD açık JavaScript veya AJAX programlaması olmadan bileşenlerin uygulanmasını kolaylaştıran işlev.
Basit bir web uygulamasını düşünün: "test"Web2py uygulamasını dosyadaki özel modelle genişleten"models/db_comments.py”.
db.define_table(
'comment_post', Field('body','text',
label = 'Your comment'),auth.signature
)
Yukarıdaki kod bir tablo oluşturacaktır "comment_post"Uygun tablo tanımı ile. Eylem, "controllers/comments.py”.
def post():
return dict(
form = SQLFORM(db.comment_post).process(),
comments = db(db.comment_post).select()
)
İlgili görünüm şu şekilde görüntülenecektir -
{{extend 'layout.html'}}
{{for post in comments:}}
<div class = "post">
On {{= post.created_on}} {{= post.created_by.first_name}}
says <span class = "post_body">{{= post.body}}</span>
</div>
{{pass}}
{{= form}}
Sayfaya verilen URL kullanılarak erişilebilir - http://127.0.0.1:8000/test/comments/post
Yukarıda bahsedilen yöntem, LOAD işlevinin uygulanmasıyla değiştirilebilen, bir görünüme erişmenin geleneksel bir yoludur.
Bu, uzantı ile yeni bir görünüm oluşturarak elde edilebilir. ".load" bu düzeni genişletmez.
Oluşturulan yeni görünüm "views/comments/post.load" -
<div class = "post">
On {{= post.created_on}} {{= post.created_by.first_name}}
says <blockquote class = "post_body">{{= post.body}}</blockquote>
</div>
{{pass}}
{{= form}}
Sayfaya erişim URL'si şu şekilde olacaktır: http://127.0.0.1:8000/test/comments/post.load
LOAD bileşeni, web2py uygulamasının diğer herhangi bir sayfasına gömülebilir. Bu, aşağıdaki ifade kullanılarak yapılabilir.
{{= LOAD('comments','post.load',ajax = True)}}
Örneğin, Controllers olarak düzenlenebilir -
def index():
return dict()
İçinde View, bileşeni ekleyebiliriz -
{{extend 'layout.html'}}
{{= LOAD('comments','post.load',ajax = True)}}
Sayfaya URL ile erişilebilir - http://127.0.0.1:8000/test/default/index
Bileşen Eklentileri
Bileşen eklentileri, benzersiz şekilde tanımlayan eklentilerdir. Components. Bileşenler, veritabanına doğrudan model tanımlarıyla erişir.
Önceki örnekte belirtildiği gibi, yorumlar bileşeni bir comments_plugin yapılabilir Models bölüm -
"models/plugin_comments.py"-
db.define_table(
'plugin_comments_comment',
Field('body','text', label = 'Your comment'),
auth.signature
)
Controller aşağıdaki eklentiyi içerecek -
def plugin_comments():
return LOAD('plugin_comments','post',ajax = True)
Ubuntu'da (Linux) web2py kurulumu
Ubuntu Masaüstüne web2py kurulumu için aşağıdaki adımlar uygulanır.
Step 1 - web2py'yi indirin
cd /home
mkdir www-dev
cd www-dev
wget http://www.web2py.com/examples/static/web2py_src.zip
Step 2 - İndirme işlemi tamamlandıktan sonra sıkıştırılmış dosyayı açın.
unzip -x web2py_src.zip
Step 3 - GUI'ye erişmeniz gerekiyorsa, isteğe bağlı olarak Python için tk kitaplığını yükleyin.
sudo apt-get install python-tk
Step 4 - web2py'yi başlatmak için web2py dizinine erişin ve web2py'ı çalıştırın.
cd web2py
python web2py.py
GUI aşağıdaki gibi görünecektir -
Kurulumdan sonra, her çalıştırdığınızda web2py sizden bir şifre seçmenizi isteyecektir. Bu parola, yönetici parolanızdır. Şifre boş bırakılırsa, yönetici arayüzü devre dışı bırakılacaktır.
Sunucu başlatıldığında, web2py aşağıdaki belirtilen URL ile ekrana yönlendirecektir - http://127.0.0.1:8000/
Bu, web2py'nin Ubuntu masaüstünde mükemmel şekilde çalıştığı sonucuna varacaktır.
Ubuntu'da Üretim Dağıtımı
Step 1 - web2py'yi çalıştırmak için gerekli tüm modüllerin kurulumu.
PostgreSQL kurulumu
sudo apt-get install postgresql
Ssh sunucusunu sıkıştırın ve açın
sudo apt-get install unzip
sudo apt-get install openssh-server
Apache 2 ve mod-wsgi kurulumu
sudo apt-get install apache2
sudo apt-get install libapache2-mod-wsgi
Step 2 - / home / www-data içine web2py kurulumu
Bu, üretim ortamında doğru dağıtım için yardımcı olur.
sudo apt-get install unzip
sudo apt-get install openssh-server
cd /home
sudo mkdir www-data
cd www-data
Web2py kaynağını web2py sitesinden alın -
sudo wget http://web2py.com/examples/static/web2py_src.zip
sudo unzip web2py_src.zip
sudo chown -R www-data:www-data web2py
Step 3- Kendinden imzalı bir sertifika oluşturun. SSL sertifikaları güvenilir bir Sertifika Yetkilisinden alınmalıdır. İçindeki sertifikalarla bir SSL klasörü oluşturun.
Step 4 - Apache yapılandırmasını üretim ortamının gereksinimlerine göre düzenleyin.
Step 5 - Apache sunucusunu yeniden başlatın ve üretim ortamının verilen IP adresi için çalışıp çalışmadığını doğrulayın.
Windows'a web2py kurulumu
Windows ortamları için ikili bir dağıtım olmasına rağmen (yürütülebilir dosyaları ve standart kitaplıkları paketleme), web2py açık kaynak kodludur ve normal bir Python kurulumuyla kullanılabilir.
Bu yöntem, web2py'nin en son sürümleri ile çalışmaya ve kullanılacak python modüllerini özelleştirmeye izin verir.
Step 1 - Kaynak paketi web2py resmi web sitesinden indirin - http://www.web2py.com/examples/static/web2py_src.zip ve açın.
Web2py kurulum gerektirmediğinden, kullanıcı bunu herhangi bir klasörde açabilir.
Step 2 - Başlamak için çift tıklayın web2py.py. Konsoldan -
cd c:\web2py
c:\python27\python.exe web2py.py
Step 3- Buraya komut satırı parametreleri eklenebilir (−a bir yönetici şifresi ayarlamak için, −p alternatif bir bağlantı noktası belirlemek için). Başlangıç seçenekleri -
C:\web2py>c:\python27\python.exe web2py.py --help
Not
web2py, çalıştırmak için derleme veya karmaşık kurulum gerektirmeyen taşınabilir, yorumlanmış ve dinamik bir dil olan Python ile yazılmıştır.
Sanal bir makine (Java ve .Net gibi) kullanır ve komut dosyalarınızı çalıştırdığınızda kaynak kodunuzu anında bayt olarak derleyebilir.
Veritabanı ve Test için web2py'deki işlevler
Web2py modelleri oluşturmaya yardımcı olan ve karşılık gelen kodu üreten SQLDesigner adlı bir yazılımdır. Aşağıda verilen ekran görüntülerinden bazıları verilmiştir -
SQLDesigner, tabloların ilişkilerini basit bir şekilde korumaya yardımcı olur ve verilen uygulamanın modellerinde karşılık gelen kodu üretir.
Fonksiyonel test
İşlevsel test, bileşenlerin veya genel sistemin işlevlerinin test edilmesini içerir. İhtiyaca ve iş sürecine dayalı olabilir.
web2py bir modülle birlikte gelir gluon.contrib.webclient, uzak ve yerel web2py uygulamalarında işlevsel testler gerçekleştirir. Temel olarak web2py oturumunu ve geri göndermeleri anlamak için tasarlanmıştır.
Gereken tek şey, işlevsel testin verilen modülde uygulanacağı şekilde paketi içe aktarmaktır.
Paketi içe aktarmak için sözdizimi aşağıdaki gibidir -
from gluon.contrib.webclient import WebClient
Önceki bölümlerde, web2py'nin çeşitli araçlarla uygulanması hakkında tam bilgi vardı. Web2py uygulamalarının geliştirilmesindeki en büyük endişe, bir kullanıcının bakış açısından güvenliği içerir.
Web2py'nin benzersiz özellikleri aşağıdaki gibidir -
Kullanıcılar uygulamayı kolayca öğrenebilirler. Kurulum ve bağımlılık gerektirmez.
Piyasaya sürüldüğü günden beri kararlı.
web2py hafiftir ve Veri Soyutlama Katmanı ve şablon dili için kitaplıklar içerir.
Web sunucuları ve uygulamalar arasında bir iletişim görevi gören Web Sunucusu Ağ Geçidi Arayüzü yardımıyla çalışır.
Açık web uygulaması güvenlik projesi (OWASP), web uygulamasının güvenlik ihlallerini listeleyen bir topluluktur.
Güvenlik ihlalleri
OWASP ile ilgili olarak, web uygulamalarıyla ilgili sorunlar ve web2py'nin bunları nasıl aştığı aşağıda tartışılmaktadır.
Çapraz Taraflı Komut Dosyası
XSS olarak da bilinir. Bir uygulama, kullanıcı tarafından sağlanan verileri aldığında ve içeriği kodlamadan veya doğrulamadan kullanıcının tarayıcısına gönderdiğinde ortaya çıkar. Saldırganlar, çapraz taraflı komut dosyası kullanarak solucan ve virüs enjekte etmek için komut dosyaları yürütür.
web2py, içindeki tüm işlenen değişkenleri engelleyerek XSS'yi önlemeye yardımcı olur. View.
Bilgi Sızıntısı
Bazen uygulamalar, dahili çalışmalar, gizlilik ve yapılandırmalar hakkında bilgi sızdırır. Saldırganlar, ciddi saldırılara neden olabilecek hassas verileri ihlal etmek için bunu kullanır.
web2py bunu biletleme sistemi ile engeller. Tüm hataları günlüğe kaydeder ve hatası kaydedilen kullanıcıya bilet düzenlenir. Bu hatalara yalnızca yönetici erişebilir.
Bozuk Kimlik Doğrulama
Hesap kimlik bilgileri genellikle korunmaz. Saldırganlar, kullanıcının kimliklerini çalmak için parolalardan, kimlik doğrulama belirteçlerinden ödün verir.
web2py, yönetim arabirimi için bir mekanizma sağlar. Ayrıca, istemci "localhost" olmadığında güvenli oturumları kullanmaya zorlar.
Güvensiz İletişim
Bazen uygulamalar ağ trafiğini şifreleyemez. Hassas iletişimleri korumak için trafiği yönetmek gereklidir.
web2py, iletişimin şifrelenmesini sağlamak için SSL etkin sertifikalar sağlar. Bu aynı zamanda hassas iletişimi sürdürmeye yardımcı olur.
URL Erişiminde Kısıtlama
Web uygulamaları normalde bazı kullanıcılara bağlantıların ve URL'lerin görüntülenmesini engelleyerek hassas işlevselliği korur. Saldırganlar, URL'yi bazı bilgilerle değiştirerek bazı hassas verileri ihlal etmeye çalışabilir.
Wb2py'de, bir URL, verilen dosya yerine modüllere ve işlevlere eşlenir. Ayrıca, hangi işlevlerin genel ve hangilerinin özel olarak sürdürüldüğünü belirten bir mekanizma içerir. Bu, sorunun çözülmesine yardımcı olur.