Pereiti prie turinio

Rekomenduojami pranešimai

Na dėl timestamp, tai aš esu pratęs kaskart vartotojui atnaujinimus puslapį jį padidinti x sekundžių.

 

Pvz. vartotojams, kurie buvo aktyvūs paskutines 5min:

 

Nustatau į duombazę ts = time() + 300

 

o paskui traukiu tik tuos, kur ts > time()

P.S. online_ts dariau IntegerField ir ten dedu šią reikšmę:

 

from time import time

 

ts = time()

Taip, jei online_ts yra IntegerField, tada darai gerai, tik, kaip sakiau, reikia naudoti __gt, __lt ir pan. :) Gal ir neverta šioj vietoj DateTimeField :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na va, jau kaip ir kibau į darbus, tačiau vėl iškilo bėdų.

 

Esmė tokia, paimsiu kitokį pavyzdį.

 

Turime 10000 daiktų, jų informaciją laikome lentelėje daiktai.

 

id (sukuria auto) | vieta | daikto_kodas

 

Toliau yra tarkim šakutės - daikto_kodas(1)

 

Taigi, jei daikto_kodas == 1, tada pridedame konkretesnę daikto informaciją į lentelę šakutės

 

id (auto) | id_daiktu_lentoj | kaina | dar_kas_nors

 

Kad būtų vaizdžiau

 

 

 

class Daiktai(models.Model):
   vieta = models.IntegerField(max_length=4)
   daikto_kodas = models.IntegerField(max_length=1)

class Šakutės(models.Model):
	id_daiktu_lentoj= models.ForeignKey(Daiktai)
   dar_kas_nors = models.CharField(max_length=50)

 

Tada aš bandau automatiškai užpildyti duombazę įrašais:

 

while ...:

m = Daiktai(vieta=x, daikto_kodas=kodas)
           m.save()
           idd = m.id


if kodas ==1:

Šakutės(id_daiktu_lentoj=idd, dar_kas_nors='bla')

 

Esmė tokia, gaunu klaidą

Cannot assign "14L": "Šakutės.id_daiktu_lentoj" must be a "Daiktai" instance.

 

Modelių pavadinimas neatitinka tikrovės, tad lietuviškų raidžių nekaltink:)

 

 

 

 

EDIT:

 

 

Lentelėje šakutės yra stulpelis userid, kuris nurodo, kuriam vartotojui ji priklauso (0, jei niekam).

 

userid = models.ForeignKey(Players, default=0)

 

Tačiau kadangi vartotojas su 0 id neegzistuoja, gaunu klaidą. Kaip šitai suvirškint?

 

 

 

 

 

Redagavo aemdy
Nuoroda į pranešimą
Dalintis kituose puslapiuose

id_daiktu_lentoje turi būti objektas. Tiksliau objektas aprašytas „Daiktai“ klase. Nors duomenų bazėje nurodomas tik objekto ID, tą pačią akimirką kai jis requestinamas programiškai yra sukuriamas objektas.

 

Šiuo atveju reikėtų daryti kažką tokio:

while ...:

m = Daiktai(vieta=x, daikto_kodas=kodas)
           m.save()
           idd = m.id//nereikalingas


if kodas ==1:
//atkreipti dėmesį į m.
Šakutės(id_daiktu_lentoj=m, dar_kas_nors='bla')

 

Tuo tarpu dėl to nepriklausymo niekam: yra null=True parinktis įgalinanti jį palikti tuščią.

 

Taigi:

userid = models.ForeignKey(Players, null=True)

Redagavo nagisa
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Išvis atsisakiau tų ForeignKey. Su jais vienos bėdos. Padariau paprasčiausią IntegerField(), paskui esant reikalui per pora užklausų išgausiu reikiamus duomenis.:)

Manau tiesiog patingėjai kažką išmokti susijusio su ryšiais. Ryšiai ir yra vienas geriausių dalykų Django (dažnai ir bet kokiame kitame) DB layeryje ir tikrai daug padeda. Jei kyla kokių problemų, tai juk rašyk - padėsim :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Django netinka programuoti žaidimui. Django buvo parašytas naujienų portalui, vėliau išleistas atviru kodu. Su django tu greitai iškepsi vieną kitą puslapį, kažkokią aplikaciją, tačiau žaidimui siūlyčiau Pyramid, http://pylonsproject.org/.

 

http://stackoverflow.com/questions/48681/pros-cons-of-django-vs-pylons

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kartais tikrai įstringu, nebežinodamas, kuria linkme eiti. Gaila, kad nėra universalaus tools'o / kalbos. Na bet būtinai pasidomėsiu.

 

P.S. Gal yra kokių e-book geresnių? Nes dokumentacijoje nėra viskas step-by-step išdėstyta.:)

 

 

Redagavo aemdy
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Django netinka programuoti žaidimui. Django buvo parašytas naujienų portalui, vėliau išleistas atviru kodu. Su django tu greitai iškepsi vieną kitą puslapį, kažkokią aplikaciją, tačiau žaidimui siūlyčiau Pyramid, http://pylonsproject.org/.

 

http://stackoverflow.com/questions/48681/pros-cons-of-django-vs-pylons

PHP buvo sukurtas asmeniniam tinklalapiui, o kiek ant jo stovi naršyklinių žaidimų? Jei yra kitų argumentų (kalbant konkrečiai apie žaidimo kūrimą), būtų įdomu išgirsti :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

PHP buvo sukurtas asmeniniam tinklalapiui, o kiek ant jo stovi naršyklinių žaidimų? Jei yra kitų argumentų (kalbant konkrečiai apie žaidimo kūrimą), būtų įdomu išgirsti :)

Nuoroda.

 

 

Po šių citatų mano nuomonė apie PHP kiek pasikeitus.:)

--

 

Nelabai vis dar suvokiu, kaip "bendrauti" su duomenų baze - įrašyti, keisti informaciją, ją ištraukti. Nei dokumentacijoj, nei knygoj nėra man aiškių pavyzdžių. Bent jau būtų gerai, jei šiuos klausimus atsakytumėt.

 

Tarkim lentelė vartotojai (pats paprasčiausias variantas.

 

class Users(models.Model):
   username = models.CharField(max_length=15)
   password = models.CharField(max_length=80)

 

 

INSERT

 

q = Users(username='Aš', password='Tu')[b]
[/b]

q.save()

 

UPDATE (kai atnaujinu tą patį įrašą)

 

q.username='Žmogus'

q.save()

 

Kai atnaujinu įrašą pagal PK

 

... nemoku ...

 

SELECT *

 

d = Users.objects.all()

print d[0].username # gal ir ne taip tiksliai, bet šiaip gaunasi

 

SELECT username

 

... tam tikro lauko ar kelių laukų pasirinkimas, nemoku ...

 

SELECT username WHERE password = 'Tu'

 

d = Users.objects.get(password='Tu')[b]
[/b]

print d[0].username # gal vėl blogai, spėju reikia vietoje get naudoti filter, nors nesu tikras ir juos maišau

 

Taip pat būtų gerai, jei parašytum, kaip visas šias užklausas atlikti vienu sakiniu.

 

--

 

Dėl ryšių (OneToOne, ManyToMany, OneToMany, ForeignKey). Šių principų neišmokau su MySQL (left join mokėjau), nes neišėjo taip, kaip norėjau. Čia irgi nesigauna taip, kaip noris, tad paliksiu juos ramybėj.

 

 

 

 

--

 

Dar pridėsiu. Silke, kur tu hostini savo saituką? Koks hostingas ir kiek už jį moki?

 

--

EDIT: Kyla problemų su sesijos panaikinimu.

 

Vartotojas prisijungia, tada padarau

request.session['userid']=userid

Viskas veikia, gerai, tačiau nuėjus į atsijungimo puslapį įvykdomas kodas

del request.session['userid']

Tačiau sesija vis dar egzistuoja.

 

 

Redagavo aemdy
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na, pirmiausia siūlyčiau neišradinėti naujos „user“ klasės ir naudoti Django auth sistemą, kurioje ir User modelis, ir prisijungimas, ir t.t. :) Jei tau neužtenka User duodamų laukų, galima prie User objekto pririšti kaip „user profile“ bet kokį, net tavo padarytą, modelį.

 

Beveik viską galima rasti Django dokumentacijoje, suprantu, kad iš pradžių sunkoka. O dabar dėl MySQL viskas :)

Gauti įrašą pagal PK:

u = Users.objects.get(pk=1)

o paskui updeitini kaip įprastai.

 

SELECT * darai gerai. Jei reikia LIMIT'o, jį galima padaryti netgi įprasta python slicing sintakse, kadangi net jei parašai Modelis.objects.all(), SQL nėra vykdomas, kol nesikreipi į grąžintą objektą (QuerySets are lazy)

Users.objects.all()[0:10]

 

SELECT username FROM ... (dokumentacija):

Users.objects.all().values('username')

 

Pagal password išvis nemanau, kad reikėtų filtruoti. Jei saugai passwordus nekoduotus - labai negerai. Vėlgi, patariu naudoti Django Auth sistemą, kuri pati koduoja užsalt'inus pass.

 

Tarp get() ir filter() skirtumas tas, kad filter() grąžina QuerySet ir skirtas gauti nesvarbu kokį objektų skaičių, o get() grąžina jau tik vieną objektą (jei randa daugiau nei vieną - error :)).

 

Aš pats JOIN per daug nemoku, paprastą JOIN'ą padarau, bet toliau nieko netyrinėjęs, Django ORM pakankamai gražų API duoda ir nereikia jokių JOIN pačiam daryt. Vėl duosiu pavyzdį su savo aplikacija:

 

 

class Twat(models.Model):
author = models.ForeignKey(User,blank=False)
text = models.TextField(max_length=256)
reply_to = models.ForeignKey('self',null=True)
date = models.DateTimeField(auto_now_add=True,editable=True)

Čia vėlgi to Twitter klono modelis - žinutė. Laukelis „author“ yra ForeignKey į autorių, reiškia viena žinutė gali turėti vieną autorių, bet vienas autorius gali turėti kiek nori žinučių.

Išsitraukus vieną žinutę:

t = Twat.objects.get(pk=1)

Django automatiškai už mus padaro visus join'us ir t.t., todėl galima prie autoriaus prieiti tiesiog:

print t.author
#arba
print t.author.username
#Django auth sistemos User modelis padarytas taip, kad 
# printinant netgi patį objektą jis išveda username 

 

Jei reikia filtruoti žinutes pagal autorių, tai taip pat paprasta:

from django.contrib.auth.models import User
u = User.objects.get(pk=1)
t = Twat.objects.filter(author=u)
# galima netgi ir paprasčiau, vėl ta sintaksė su dviem apatiniais brūkšniukais :)
t = Twat.objects.filter(author__pk=1)

 

Savo puslapį hostinu VPS'e iš static.lt, konkrečiai planas VPS-3. Žinoma, yra ir specializuotų Django hostingų. http://code.djangoproject.com/wiki/DjangoFriendlyWebHosts

 

Dėl sesijos, man taip veikia:

if 'd' in request.GET:
   del request.session['uid']
else:
   request.session['uid'] = 1

r = request.session.get('uid',0) # .get() neradęs tokio rakto duoda tai, ką nurodai antru argumentu

return HttpResponse(r) # jei naudosi šitą, from django.http import HttpResponse

 

Nuėjus į / rodo 1, nuėjus į /?d - 0. Bet vėlgi, manau Django auth sistema tiktų :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisitaikiau auth sistemą. Registracija veikia, prisijungimas veikia, tačiau vėl neeina atsijungti. Sesija išlieka.

 

auth.logout(request)

   return render_to_response(prompt.html',
       {
           'heading':'Atsijungimas',
           'link':'/',
           'linkname':'Pradžia',
           'msg':'Atsijungėte sėkmingai!'
       }
   )

 

 

Kitas klausimas. Kaip išgauti prisijungusių narių sąrašą naudojant auth sistemą?

 

Ir dar vienas. Jei registruojant vartotoją lentoje daiktai reikia sukurti kelis daiktus, tai modelį tokį daryt:

 

...

userid = models.ForeignKey(User)

 

Bei ar naudojant auth sistemą yra sukuriamas tas UserID?

 

 

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisitaikiau auth sistemą. Registracija veikia, prisijungimas veikia, tačiau vėl neeina atsijungti. Sesija išlieka.

 

auth.logout(request)

   return render_to_response(prompt.html',
       {
           'heading':'Atsijungimas',
           'link':'/',
           'linkname':'Pradžia',
           'msg':'Atsijungėte sėkmingai!'
       }
   )

 

 

Kitas klausimas. Kaip išgauti prisijungusių narių sąrašą naudojant auth sistemą?

 

Ir dar vienas. Jei registruojant vartotoją lentoje daiktai reikia sukurti kelis daiktus, tai modelį tokį daryt:

 

...

userid = models.ForeignKey(User)

 

Bei ar naudojant auth sistemą yra sukuriamas tas UserID?

Hm, neįsivaizduoju kaip gali neatijungti. Įrašyk į savo view

print dict(request.session)

Taip užloadinus puslapį dev serverio konsolėje išprintins visus request.session kintamuosius. Parašyk output'ą kai vartotojas prisijungęs. Taip pat outputą iškart po logout() :)

 

Dėl prisijungusių sąrašo: User modelis (dokumentacija) turi last_login atributą, ir pagal jį galima filtruoti:

from datetime import datetime
from time import time
data = datetime.fromtimestamp(time()-300)
User.objects.filter(last_login__gt=data)

# output: [<User: silkuze>]

 

Dėl modelio, tau kiek suprantu reikia ryšio, kad Daiktas priklauso User? Jei taip, darai gerai. Nesupratau „Bei ar naudojant auth sistemą yra sukuriamas tas UserID?“. Bet, žodžiu, darai gerai :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Hm, neįsivaizduoju kaip gali neatijungti. Įrašyk į savo view

print dict(request.session)

Taip užloadinus puslapį dev serverio konsolėje išprintins visus request.session kintamuosius. Parašyk output'ą kai vartotojas prisijungęs. Taip pat outputą iškart po logout() :)

 

Dėl prisijungusių sąrašo: User modelis (dokumentacija) turi last_login atributą, ir pagal jį galima filtruoti:

from datetime import datetime
from time import time
data = datetime.fromtimestamp(time()-300)
User.objects.filter(last_login__gt=data)

# output: [<User: silkuze>]

 

Dėl modelio, tau kiek suprantu reikia ryšio, kad Daiktas priklauso User? Jei taip, darai gerai. Nesupratau „Bei ar naudojant auth sistemą yra sukuriamas tas UserID?“. Bet, žodžiu, darai gerai :)

 

Ta prasme, man reikia esant vartotojui x gauti vartotojo y informacija.

Tai čia klausiau ar yra koks PK User lentoj, pagal kurį galima išgauti reikiamą eilutę?:)

 

Dėl sesijų, tai patikrinsiu vakare, dabar lekiu kitų darbų dirbt.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ta prasme, man reikia esant vartotojui x gauti vartotojo y informacija.

Tai čia klausiau ar yra koks PK User lentoj, pagal kurį galima išgauti reikiamą eilutę?:)

 

Dėl sesijų, tai patikrinsiu vakare, dabar lekiu kitų darbų dirbt.

Na tai imi ir pasižiūri.

In [12]: User.objects.all()[0].pk
Out[12]: 1

O šiaip Django modeliuose PK visada būna, jei jo nenurodai - sukuriamas automatiškai :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na tai imi ir pasižiūri.

In [12]: User.objects.all()[0].pk
Out[12]: 1

O šiaip Django modeliuose PK visada būna, jei jo nenurodai - sukuriamas automatiškai :)

Ką tie In[12] ir out[12] reiškia?:)

 

EDIT:

 

Vartotojas prijungtas

_auth_user_backend_auth_user_id

 

Po atsijungimo

# tuščia, bet grįžus į puslapį, kuris reikalauja būti prisijungus, viskas veikia toliau, lyg vartotojas būtų prijungtas.

 

 

Redagavo aemdy
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ką tie In[12] ir out[12] reiškia?:)

 

EDIT:

 

Vartotojas prijungtas

_auth_user_backend_auth_user_id

 

Po atsijungimo

# tuščia, bet grįžus į puslapį, kuris reikalauja būti prisijungus, viskas veikia toliau, lyg vartotojas būtų prijungtas.

In/Out nieko, čia IPython shellas :)

 

Parodyk kaip realizuoji turinio ribojimą prisijungusiems, turbūt kažką ne taip view'e darai :) Man kažkokia nuojauta, kad darai:

if request.user:
   ...

Jei taip, tada negerai, nes request.user būna net tada, jei vartotojas neprisijungęs, tik tada jis nustatomas į AnonymousUser instanciją. Daryk taip:

if request.user.is_authenticated():
   # turinys prisijungusiems
else:
   # turinys neprisijungusiems

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

In/Out nieko, čia IPython shellas :)

 

Parodyk kaip realizuoji turinio ribojimą prisijungusiems, turbūt kažką ne taip view'e darai :) Man kažkokia nuojauta, kad darai:

if request.user:
   ...

Jei taip, tada negerai, nes request.user būna net tada, jei vartotojas neprisijungęs, tik tada jis nustatomas į AnonymousUser instanciją. Daryk taip:

if request.user.is_authenticated():
   # turinys prisijungusiems
else:
   # turinys neprisijungusiems

 

# ATSIJUNGIMAS #
def Logout(request):
   if not uCon(request):
       return HttpResponseRedirect('/')
   auth.logout(request)
   return render_to_response('short.html',
       {
           'heading':'Atsijungimas',
           'link':'/',
           'linkname':'Pradžia',
           'msg':'Atsijungėte sėkmingai!'
       }
   )

# ŽAIDIMAS (PAGR. PSL) #
def Game(request):
   if not uCon(request):
       return HttpResponseRedirect('/')
   return render_to_response('game.html')

def uCon(request):
   return request.user.is_authenticated()

 

 

 

 

 

Nuoroda į pranešimą
Dalintis kituose puslapiuose

...

 

Hm, neįsivaizduoju. Pasidariau va taip vat:

def uCon(request):
   return request.user.is_authenticated()

def logout(request):
   if not uCon(request):
       return HttpResponseRedirect('/')

   auth.logout(request)

   return HttpResponse('Atjungta')

def test(request):

   if 'p' in request.GET:
       user = auth.authenticate(username='silkuze',password='###')
       if user is not None and user.is_active:
           auth.login(request,user)
           return HttpResponse('Prisijungta')

   if uCon(request):
       return HttpResponse('Turinys prisijungusiam')
   else:
       return HttpResponse('Turinys neprisijungusiam')

 

Tada iš eilės:

/test/ - Turinys neprisijungusiam
/test/?p - Prisijungta
/test/ - Turinys prisijungusiam
/logout/ - Atjungta

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 6 mėnesių...

Gaivinu temą. Galbūt nuo paskutinio post'o laiko atsirado daugiau žmonių šiame forume, kurie kuria internetinius puslapius naudodamiesi šiuo karkasu? Jau tiesiog nebeįdomu darosi iškilus problemoms lėkti į StackOverflow arba klausti Justino (Silkės) pagalbos.;)

Redagavo aemdy
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...