您的位置:首页 > 编程语言 > Go语言

[py]django常用配置

2017-08-21 16:33 363 查看

图形验证码:

pip install  django-simple-captcha


参考: http://django-simple-captcha.readthedocs.io/en/latest/usage.html#installation

新建project

django-admin startproject mysite


mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py


新建app

python manage.py startapp learn


修改setting–添加app

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

'learn',
)


urls包含设置

mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
learn/
urls.py
...


mysite/urls.py

urlpatterns = [
url(r'^admin/', admin.site.urls),
# 别忘记在顶部引入 include 函数
url(r'^learn/', include('learn.urls')),
]


注意:

url(r'^/learn/', include('learn.urls')), #不能这样写(learn前加/),否则报错


learn/urls.py

from django.conf.urls import url
from learn import views

app_name = 'learn' #这里方便html里调用url
urlpatterns = [
url(r'^add/', views.add, name='add'),
url(r'^add/(\d+)\(\d+)', views.add2, name='add2'),
]


TemplateView函数可以将html直接渲染到前端

url(r'^$', TemplateView.as_view(template_name="index.html"), name="index"),


add2.html
...
<a href='{% url "learn:add2" 4 5 %}'>4+5</a>


会渲染成:

<a href='/users/4/5/'>4+5</a>


templates文件路径设置

mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
templates/
learn/
add2.html


mysite/settings.py

TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]


静态文件路径配置

根目录下static文件夹下

STATIC_URL = '/static/'  #前端页面写这个.
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static'),
]


STATIC_URL映射到了STATICFILES_DIRS指定的目录.

STATIC_URL = '/statics/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static'),
]

前端写的时候写
<link rel="stylesheet" type="text/css" href="/statics/css/style.css">


视图配置例子

def add(request):
return render(request, "add2.html")

def add2(request, a, b):
c = int(a) + int(b)
return HttpResponse(str(c))


python3 django mysql-python

pip install pymysql

在站点的__init__.py文件中添加
import pymysql
pymysql.install_as_MySQLdb()

修改settings
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
"HOST": '127.0.0.1',
'PORT': 3306,
'USER':'root',
'PASSWORD': '',
'NAME': 'bbs',
}
}

makemigrations
migrate
然后navicat看看表存在没.


django国际化

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

USE_TZ = False


替换user表为自定义表

AUTH_USER_MODEL = "users.UserProfile"


替换authenticate方法实现邮箱and用户名同时可登录

AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend',
)


from django.db.models import Q
from django.contrib.auth.backends import ModelBackend

class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username) | Q(email=username))
if user.check_password(password):
return user
except Exception as e:
return None


邮箱配置

EMAIL_HOST = "smtp.sina.com"
EMAIL_PORT = 25
EMAIL_HOST_USER = "lanny@sina.com"
EMAIL_HOST_PASSWORD = "123456"
EMAIL_USE_TLS = False
EMAIL_FROM = "lanny@sina.com"


返回view

from django.views.generic import TemplateView

urlpatterns = [
url(r'^$', TemplateView.as_view(template_name="index.html"), name="index"),                 # 通过url直接返回html
url(r'^login/', views.LoginView.as_view(), name="login"),                                   # 通过后端来渲染的view
url(r'^active/(?P<active_code>.*)/$',views.ActiveUserView.as_view(),name="user_active"),
]


reverse函数解析url name

from django.urls import reverse

def get(self, request):
logout(request)
return HttpResponseRedirect(reverse("index"))


后端基于class来写

省去了if request.method == “POST”等重复性代码

from django.views.generic.base import View
from django.contrib.auth import authenticate, login, logout

class LoginView(View):
def get(self, request):
return render(request, "login.html")

def post(self, request):
login_form = LoginForm(request.POST)
if login_form.is_valid():
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
user = authenticate(username=user_name, password=pass_word)
print(user)
if user is not None:
if user.is_active:
login(request, user)
return render(request, "index.html")
else:
return render(request, "login.html", {"msg": "用户未激活"})
else:
return render(request, "login.html", {"msg": "用户不存在"})
else:
return render(request, "login.html", {"msg": "用户不存在", "login_form": login_form})


退出view

class LogoutView(View):
def get(self, request):
logout(request)
return HttpResponseRedirect(reverse("index"))


表单渲染

from django import forms
from captcha.fields import CaptchaField

class LoginForm(forms.Form):
username = forms.CharField(required=True)
password = forms.CharField(required=True, min_length=5)

class RegisterForm(forms.Form):
email = forms.EmailField(required=True)
password = forms.CharField(required=True, min_length=5)
captcha = CaptchaField(error_messages={"invalid": "验证码错误"})


class RegisterView(View):
def get(self, request):
register_form = RegisterForm()                                                # 这里
...

def post(self, request):
register_form = RegisterForm(request.POST)                                     #这里
...
return render(request, 'register.html', {"register_form": register_form, "msg": ""})


前端:

- 1.name和后端forms一致

<p>邮箱: <input type="text" name="email">{{ register_form.errors.email }}</p>


2.后端forms直接实例化后,调用某个字段在前端显示

<p>{{ register_form.captcha }}{{ register_form.errors.captcha }}</p>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: