Django'nun ./manage.py syncdb'sini çalıştırırken otomatik olarak bir yönetici kullanıcı oluşturun


82

Projem erken geliştirme aşamasında. Sık sık veritabanını silerim ve manage.py syncdbuygulamamı sıfırdan kurmak için çalıştırırım .

Ne yazık ki, bu her zaman ortaya çıkıyor:

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): 

Daha sonra bir kullanıcı adı, geçerli bir e-posta adresi ve şifre sağlamış olursunuz. Bu sıkıcı. Yazmaktan sıkılmaya başladım test\nx@x.com\ntest\ntest\n.

Çalıştırırken bu adımı otomatik olarak nasıl atlayabilir ve programlı bir kullanıcı oluşturabilirim manage.py syncdb?


syncdbveri taşıma lehine kullanımdan kaldırıldı
Sdra

Yanıtlar:


80

Sorunun zaten cevaplandığını biliyorum ama ...

Çok daha basit bir yaklaşım, yetkilendirme modülü verilerini süper kullanıcı oluşturulduktan sonra bir json dosyasına dökmektir:

 ./manage.py dumpdata --indent=2 auth > initial_data.json

Ayrıca oturum verilerini boşaltabilirsiniz:

./manage.py dumpdata --indent=2 sessions

Daha sonra oturum bilgisini kimlik doğrulama modülü dökümüne ekleyebilirsiniz (ve muhtemelen expire_date değerini artırarak süresi dolmasın ... hiç ;-).

O andan itibaren kullanabilirsiniz

/manage.py syncdb --noinput

db'yi oluştururken süper kullanıcı ve oturumunu, size bir süper kullanıcı hakkında soru sormadan etkileşimli olarak yüklemek için.


1
Bu gerçekten kabul edilen cevap olmalı. En basit IMO. Bağlantı koptu. :(
bnjmn

4
Nerede koymak gerekir initial_data.jsonki syncdbbuluntular o? Dokümanlar şunu söylüyor: "Yüklü her uygulamanın fikstür dizininde" . Bu örneğin ./eggs/Django-1.6.5-py2.7.egg/django/contrib/auth/fixturesmi?
user272735

2
Bu, Django 1.7'den beri kullanımdan kaldırılmıştır: docs.djangoproject.com/en/1.7/howto/initial-data/… Artık Veri geçişlerini kullanabilirsiniz.
Germain Chazot

49

Tüm veritabanınızı silmek yerine, syncdb'yi çalıştırmadan önce uygulamanızın tablolarını silmeniz yeterlidir.

Bu, sizin için tek bir satırda (uygulama başına) başaracaktır:

python manage.py sqlclear appname | python manage.py dbshell

İlk komut uygulamanıza bakacak ve tabloları bırakmak için gerekli SQL'i oluşturacaktır. Bu çıktı daha sonra onu yürütmek için dbshell'e aktarılır.

Tamamlandıktan sonra, tabloları yeniden oluşturmak için syncdb'nizi çalıştırın:

python manage.py syncdb

2
Bu cevabı beğendim. Önerin için teşekkürler!
ropable

Ben de teşekkürler! temiz çözüm, zaten ihtiyacım olduğunda senkronize ettiğim temiz bir döküm için kullanıyorum.
Andrei-Niculae Petre

28

Anahtar, --noinputsyncdb sırasında kullanmak ve ardından bunu one linersüper kullanıcı oluşturmak için kullanmaktır.

echo "from django.contrib.auth.models import User; User.objects.create_superuser('myadmin', 'myemail@example.com', 'hunter2')" | python manage.py shell

Kredi: http://source.mihelac.org/2009/10/23/django-avoiding-typing-password-for-superuser/


5
Teşekkürler! Bu, diğerlerinden daha net, daha sağlam ve genişletilebilir ve kodunuzu ilk kez çalıştırdığınızda, test komut dosyalarında ve belirli dağıtım senaryolarında ve tabii ki soruyu yönlendiren geliştirme senaryosunda kullanım için harikadır .
nealmcb

16

Eğer benim yaptığım gibi, süper kullanıcı sorusu sorulmadan yeni bir veritabanıyla gerçekten başlamak istiyorsanız, o zaman bu soruyu soran sinyal işleyicinin kaydını kaldırabilirsiniz. Dosyanın en altına bakın:

django/contrib/auth/management/__init__.py

süper kullanıcı işlevinin kaydının nasıl gerçekleştirildiğini görmek için. Bu kaydı geri alabileceğimi ve bu kodu "models.py" içine yerleştirirsem "syncdb" sırasında soruyu asla sormayacağımı öğrendim:

from django.db.models import signals
from django.contrib.auth.management import create_superuser
from django.contrib.auth import models as auth_app

# Prevent interactive question about wanting a superuser created.  (This
# code has to go in this otherwise empty "models" module so that it gets
# processed by the "syncdb" command during database creation.)

signals.post_syncdb.disconnect(
    create_superuser,
    sender=auth_app,
    dispatch_uid = "django.contrib.auth.management.create_superuser")

Bu kodun kaydı yapan Django kodundan sonra çalıştırılacağını nasıl garanti edeceğimi bilmiyorum . INSTALLED_APPS içinde uygulamanızdan veya django.contrib.auth uygulamasından ilk olarak bahsedilip bahsedilmeyeceğine bağlı olacağını düşünmüştüm, ancak bunları yerleştirdiğim sıraya bakılmaksızın benim için işe yarıyor gibi görünüyor. Belki alfabetik olarak yapılıyor ve ben uygulamamın adı "d" harfinden sonraki bir harfle başladığı için şanslı mısınız? Yoksa Django önce kendi işini yapacak kadar akıllı mı, sonra ayarlarıyla karıştırmak istemem durumunda benimki mi? Öğrenirsen bana haber ver. :-)


Nihayet bu uygulanacak ve (eğer benim kendi test kullanıcı oluşturmak için bir kanca eklendi settings.DEBUGolduğunu True) otomatik. Tekrar teşekkürler!
ücretli bir inek

11

Ben kullanarak bu özelliği üstesinden ettik güney

Herhangi bir django geliştiricisi için sahip olması gereken bir şey.

South, bilgileri veya veritabanı yapısını bozmadan değişiklikleri canlı siteye taşımaya yardımcı olmak için tasarlanmış bir araçtır. Ortaya çıkan değişiklikler güney tarafından izlenebilir ve oluşturulan python dosyaları kullanılarak aynı eylemleri alternatif bir veritabanında gerçekleştirilebilir.

Geliştirme sırasında, bu aracı veritabanı değişikliklerimi izlemek için ve önce onu yok etmeye gerek kalmadan veritabanında bir değişiklik yapmak için kullanıyorum.

  1. easy_install güney
  2. Yüklü uygulamalarınıza 'güney' ekleyin

Bir uygulamada ilk kez güneyde koşmayı önerme.

$ python manage.py schemamigration appname --init

Bu, o uygulamada şema algılamayı başlatacaktır.

$ python manage.py migrate appname

Bu, model değişikliklerini uygulayacak

  • Veritabanı yeni modellere sahip olacak.

İlk çalıştırmadan sonra bir modelin değiştirilmesi

$ python manage.py schemamigration appname --auto

$ python manage.py migrate appname


Modeller değişmiş olacak - veriler yok edilmeyecek. Artı güney çok daha fazlasını yapar ...


9

Not: 1.7 sürümü syncdbkomutu kullanımdan kaldırıldığından beri . migrate Bunun yerine kullanın .

Ayrıca Django 1.7 , uygulamaların başlatma sürecini özelleştirme aracı olarak AppConfig'i tanıttı .

Bu nedenle, Django 1.7'den beri, istediğinizi elde etmenin en basit yolu, bir AppConfigalt sınıf kullanmaktır.

Söz edelim, kendi var ne example_appadresinden Müşteri eklendiğini INSTALLED_APPSve sen ve oluşturmak istediğiniz yönetici ile kullanıcı yönetici çalıştırmak zaman şifre ./manage.py migratesıfırdan. Ayrıca otomatik yönetici kullanıcı oluşturma sadece gerekli olduğunu varsayalım dev değil - Çevre üretimi .

Aşağıdaki kodu şuraya ekleyin: example_app/apps.py

# example_app/apps.py

from django.apps import AppConfig
from django.conf import settings
from django.db.models.signals import post_migrate
from django.contrib.auth.apps import AuthConfig


USERNAME = "admin"
PASSWORD = "admin"


def create_test_user(sender, **kwargs):
    if not settings.DEBUG:
        return
    if not isinstance(sender, AuthConfig):
        return
    from django.contrib.auth.models import User
    manager = User.objects
    try:
        manager.get(username=USERNAME)
    except User.DoesNotExist:
        manager.create_superuser(USERNAME, 'x@x.com', PASSWORD)


class ExampleAppConfig(AppConfig):
    name = __package__

    def ready(self):
        post_migrate.connect(create_test_user)

Ayrıca, uygulamaların içindeki uygulama yapılandırmasına aşağıdaki referansı ekleyin example_app/__init__.py:

# example_app/__init__.py

default_app_config = 'example_app.apps.ExampleAppConfig'

Default_app_config, buradaAppConfig bahsedildiği gibi alt sınıfa giden bir dize Python yoludur .


2
Ne yazık ki, bu artık Django 1.9'dan itibaren django.contrib.authçalışmıyor çünkü artık yapılandırma zamanında mevcut değil. Bu tasarım gereğidir ve 1.8'den beri kullanımdan kaldırılmıştır, bu nedenle geri gelmesi pek olası değildir. Bu çok üzücü ... Bu hack'i beğendim.
Adrian Petrescu

Tamam, kodunuzu Django 1.9 ile çalışmak için nasıl düzelteceğimi buldum! Yanıtınızı düzeltmelerle düzenledim. Gönderdiğiniz için teşekkürler :)
Adrian Petrescu


3

Bunu sizin için yapmak için django-finalware'i kullanabilirsiniz . Sadece finalwarekendi sayfanıza ekleyin INSTALLED_APPSve aşağıdakileri ekleyin settings.py:

SITE_SUPERUSER_USERNAME = 'myadmin'
SITE_SUPERUSER_EMAIL = 'myadmin@example.com'
SITE_SUPERUSER_PASSWORD  = 'mypass'  # this can be set from a secret file.

# optional object id. Ensures that the superuser id is not set to `1`.
# you can use this as a simple security feature
SITE_SUPERUSER_ID = '343'

Ardından ./manage.py syncdb(Django <1.7) veya ./manage.py migrate(Django> = 1.7) çalıştırın ve sizin için otomatik olarak bir süper kullanıcı oluşturacak veya mevcut olanı güncelleyecektir.

Artık bir süper kullanıcı oluşturmanız istenmiyor.


Sizin tarafınızdan oluşturulmuşsa lütfen bir sorumluluk reddi beyanı ekleyin
Erion S

Django> = 2.0 ile uyumlu mu?
Dunatotatos

@Dunatotatos evet öyle. Django sürüm desteği, deponun .travis.yml dosyasında da bulunabilir
un33k

3

Django 1.7'den beri, veritabanını doldurmanın önerilen yolu veri geçişleridir. Yöneticiyi oluşturmak üzere bir veri geçişi oluşturmak için önce boş bir taşıma oluşturmalısınız:

./manage.py makemigrations --empty myapp --name create-superuser

Bu, içinde boş bir geçiş yaratacaktır myapp/migrations/000x__create-superuser.py. Dosyayı şöyle görünecek şekilde düzenleyin:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models
from django.contrib.auth.models import User


def create_superuser(apps, schema_editor):
    User.objects.create_superuser(username='myadmin', password='mypassword', email='myemail@gmail.com')


class Migration(migrations.Migration):

    dependencies = [('myapp', '000y_my-previous-migration-file'),]

    operations = [migrations.RunPython(create_superuser)]

3

Tüm öğelerimi sıfırlamak için bunun gibi bir python betiği oluşturmayı çözdüm [güncellenmiş sürüm] [1.8 de]:

import os
import sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings.dev")

from django.conf import settings
from django.core import management
from django import get_version

PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
if PROJECT_ROOT not in sys.path:
    sys.path.append(PROJECT_ROOT)

yn = raw_input('Are you sure you want to reset everything? (y/n) ')
if yn == 'y':

    # Drops the db / creates the db
    if settings.DATABASES['default']['ENGINE'].find('mysql') != -1:
        os.system('mysqladmin -uroot -pIronlord0 -f drop db')
        os.system('mysqladmin -uroot -pIronlord0 -f create db')
    elif settings.DATABASES['default']['ENGINE'].find('psycopg2') != -1:
        os.system('psql -U postgres -c "DROP DATABASE db"')
        os.system('psql -U postgres -c "CREATE DATABASE db WITH OWNER = admin"')
    elif settings.DATABASES['default']['ENGINE'].find('sqlite3') != -1:
        try:
            os.remove(os.path.join(PROJECT_ROOT, 'data.db'))
        except:
            pass

    # Getting application handle here otherwise db gets allocated and it can not be destroyed.
    if get_version() > '1.6.10':
        from django.core.wsgi import get_wsgi_application
        application = get_wsgi_application()

    management.call_command('syncdb', interactive=False)

    # Creates admin/password
    from django.contrib.auth.management.commands import changepassword
    management.call_command('createsuperuser', interactive=False, username="admin", email="xxx@example.com")
    command = changepassword.Command()
    command._get_pass = lambda *args: 'password'
    if get_version() >= '1.8':
        command.execute(username="admin")
    else:
        command.execute("admin")


    # Creates the default site entry
    from django.contrib.sites.models import Site
    site = Site.objects.get_current()
    site.domain = 'www.example.com'
    site.name = ' xxx '
    site.save()

mucizevi şekilde çalışır!

Not: Bu betiği çalıştırmadan önce yukarıdaki db'nin sorumlu olduğu (test) sunucunuzu durdurduğunuzdan emin olun!


2

dumpdataYönetim komutuna bir göz atın . Örneğin:

python manage.py dumpdata > initial_data.json

Fikstür adı verilen bu dosya initial_data(.xml veya .json) olarak adlandırılırsa , syncdbkomut onu alır ve tablolarınızı buna göre doldurur. Yine de bir kullanıcı oluşturmak isteyip istemediğinizi soracaktır, ancak güvenli bir şekilde "hayır" yanıtını verebileceğinize inanıyorum, bu noktadan sonra veritabanınızı fikstürünüze göre dolduracaktır.

Bununla ilgili daha fazla bilgi belgelerde bulunabilir .


1
İnitial_data.json
philgo20

2

Sqlite ile geliştirme. Dosyayı silerek veritabanını temizleyin. Fikstürlerden yönetici yükle.

Manage.py'yi değiştirin (django 1.4):

# hack to prevent admin promt
if  len(sys.argv) == 2 and sys.argv[1] == 'syncdb':
    sys.argv.append('--noinput')

2
if 'syncdb' in sys.argv: sys.argv.append('--noinput')
TIMP

1

Buna çözümüm, veritabanımı silerken bu kimlik doğrulama tablolarını silmemekti.


1

Doğrudan python kaynak dosyasına başlatma kodunu yazmayı tercih ediyorsanız, bu kod değiştirilmiş manage.py yardımcı olabilir (ve Cjkjvfnby'nin küçük kodu için teşekkürler!):

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    # set your django setting module here
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") 

    from django.core.management import execute_from_command_line

    # hack to prevent admin prompt
    if len(sys.argv) == 2 and sys.argv[1] == 'syncdb':
        sys.argv.append('--noinput')

    execute_from_command_line(sys.argv)

    # additional process for creation additional user, misc data, and anything
    for arg in sys.argv:
        # if syncdb occurs and users don't exist, create them
        if arg.lower() == 'syncdb':
            print 'syncdb post process...'
            from django.contrib.auth.models import User

            admin_id = 'admin'
            admin_email = 'superuser@mail.com'
            admin_password = 'superuser_password'
            additional_users = [
                                ['tempuser', 'user_email@mail.com', 'tempuser_password']
                                ]

            # admin exists?
            user_list = User.objects.filter(username=admin_id)
            if len(user_list) == 0: 
                print 'create superuser: ' + admin_id
                new_admin = User.objects.create_superuser(admin_id, admin_email, admin_password)

            # additional user exists?
            for additional_user in additional_users:
                user_list = User.objects.filter(username=additional_user[0])
                if len(user_list) == 0: 
                    print 'create additional user: ' + additional_user[0]
                    new_admin = User.objects.create_user(additional_user[0], additional_user[1], additional_user[2])

            # any other data

Burada sadece kullanıcı oluşturma kodunu gösteriyorum, ancak bu kodu istediğiniz kadar geliştirebilirsiniz.


0

Sqlite'ı dev veritabanı olarak kullanıyorum. Model sınıflarını değiştirdikten sonra, karşılık gelen tabloları sqlite yöneticisi (bir firefox eklentisi, yine de verileri incelemek için açın) ile bırakın ve manage.py syncdbeksik olanı yeniden oluşturmak için çalıştırın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.