[py]django常用配置

图形验证码:

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值