Django web 开发常规操作

一、前言

参考个人 JavaEE 开发的经验,这次借助 Django 框架使用 Python 语言来实现 web 开发 高频的 常规操作:尽在代码中

WEB 参考文章
1、Get/Post请求
2、文件上传
3、数据分页
4、前后端分离ajax交互
5、设置时区
6、使用MySQL Dajango 数据库切换为MYSQL的问题:Error loading MySQLdb module.解决方案
7、访问解决访问ip限制
8、csrf_token 解决

Git代码地址:https://github.com/larger5/mysql_django.git

其他的,日后有空有心情再更新

二、代码

M+V+T+url+settings
这里写图片描述

2.1.M-models.py(看看就好)

from django.db import models

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField()
    bread = models.IntegerField(default=0)
    bcommet = models.IntegerField(default=0)
    isDelete = models.BooleanField(default=False)
    class Meta:
        db_table = 'booktest_bookinfo'

class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)
    hgender = models.BooleanField(default=True)
    isDelete = models.BooleanField(default=False)
    hcontent = models.CharField(max_length=100)
    hbook = models.ForeignKey('BookInfo',on_delete=models.CASCADE)  # 注意后面 Django2.0 必备
    class Meta:
        db_table = 'booktest_heroinfo'

2.2.V-views.py

# -*- coding:utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from .models import *
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings    # 获取 settings.py 里边配置的信息
import os
from django.core.paginator import Paginator
from django.http import JsonResponse
from django.core   import serializers

# 1.1.进入首页
def index(request):
    return render(request,"booktest/index.html")

# 2.GET 请求测试
def getTest(request):
    a=request.GET['a']
    b=request.GET['b']
    context = {'a': a, 'b': b}
    return render(request, 'booktest/showTest.html', context)

# 3.POST 请求测试
# @csrf_exempt    # 没有这个注解就没有权限调用 # 或者在form 中加入 {% csrf_token %}
def postTest(request):
    itaem=request.POST['itaem']
    context={'itaem':itaem}
    return render(request, 'booktest/showTest.html', context)

# 4.文件上传测试
def upload(request):
    if request.method == "POST":
        f1 = request.FILES['pic']
        fname = os.path.join(settings.MEDIA_ROOT,f1.name)
        with open(fname, 'wb') as pic:
            for c in f1.chunks():
                pic.write(c)
        return HttpResponse("<img src='/static/media/%s'></img>"%f1.name)
    else:
        return HttpResponse("error")

# 5.分页显示数据
def pagTest(request, pIndex):
    data = HeroInfo.objects.all()
    # 每页数量
    data_size = Paginator(data, 5)
    if pIndex == '':
        pIndex = '1'
    pIndex = int(pIndex)
    # 选页
    data_size_page = data_size.page(pIndex)
    plist = data_size.page_range
    return render(request, 'booktest/showTest.html', {'list': data_size_page, 'plist': plist, 'pIndex': pIndex})

# 6.返回 json 字符串
def getJson(request):
    temp = BookInfo.objects.all()
    data = []
    # 必须全为字典的格式
    for a in temp:
        data.append({'id': a.id, 'title': a.btitle,"bcommet":a.bcommet,"bpub_date":a.bpub_date,"isDelete":a.isDelete,"bread":a.bread})
    return JsonResponse({'data': data})

2.3.T-index.html+showTest.html

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TEST</title>
</head>
<body>

    <h1>1.Test GET</h1>
    <a href="/getTest/?a=1&b=2">get</a><br>

    <h1>2.Test POST</h1>
    <form method="post" action="/postTest/">
        {% csrf_token %}
        <input name="itaem" id="itaem" placeholder="itaem">
        <input type="submit" value="提交"/>
    </form>

    <h1>3.文件上传</h1>
    <form method="post" action="upload/" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="file" name="pic"/><br>
        <input type="submit" value="上传">
    </form>

</body>
</html>

showTest

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>show</title>
</head>
<body>
    <h1>5.分页</h1>
    a:{{ a }}
    <hr>
    b:{{ b }}
    <hr>
    itaem:{{ itaem }}
    <hr>
    <hr>
    <ul>
        {%for hero in list%}
        <li>{{hero.hname}}</li>
        {%endfor%}
    </ul>
    {%for pindex in plist%}
    {%if pIndex == pindex%}
    {{pindex}}&nbsp;&nbsp;
    {%else%}
    <a href="/pag{{pindex}}/">{{pindex}}</a>&nbsp;&nbsp;
    {%endif%}
    {%endfor%}

    <h1>6.json</h1>
    <a href="http://localhost:8080/getJson">getJson</a>

</body>
</html>

2.4.url

from django.contrib import admin
from django.urls import path

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

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^index$', views.index),
    url(r'^getTest/$', views.getTest),
    url(r'^postTest/$',views.postTest),
    url(r'^upload/$',views.upload),
    url(r'^pag(?P<pIndex>[0-9]*)/$', views.pagTest, name='pagTest'),
    url(r'^getJson$', views.getJson),
]

2.5.settings

import os
import pymysql      # 注意要加上这些
pymysql.install_as_MySQLdb()     # 注意要加上这些

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'uj%gwok)4i-=4^a*cu_-(yr)v)jlcsb11r2(+@&+o+o)7+plvw'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

# 解决访问限制
ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booktest', # 注意引入自己的模块
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'MysqlPython.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'MysqlPython.wsgi.application'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'itaem',    # 数据库名
        'USER': 'root',     # 数据库用户名
        'PASSWORD': '123',  # 数据库密码
        'HOST': '120.79.197.130',   # 数据库地址
        'PORT': '3307', # 数据库端口号,默认3306
    }
}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

#设置时区
LANGUAGE_CODE = 'zh-hans'  #中文支持,django1.8以后支持;1.8以前是zh-cn
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False   #默认是Ture,时间是utc时间,由于我们要用本地时间,所用手动修改为false!!!!

# 图片访问的路径
STATIC_URL = '/static/'
# 图片存放的路径
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
# 图片上传的路径
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")

三、小结

解决测试代码时 Django post CSRF verification failed. Request aborted.的问题(任选其一)
{% csrf_token %} 如:

    <h1>2.Test POST</h1>
    <form method="post" action="/postTest/">
        {% csrf_token %}
        <input name="itaem" id="itaem" placeholder="itaem">
        <input type="submit" value="提交"/>
    </form>

② 在 views 中的方法上加上 @csrf_exempt

# 3.POST 请求测试
@csrf_exempt    
def postTest(request):
    itaem=request.POST['itaem']
    context={'itaem':itaem}
    return render(request, 'booktest/showTest.html', context)

四、问题与解决

猜你喜欢

转载自blog.csdn.net/larger5/article/details/80885611
今日推荐