Django Web框架的使用(python)

1、Django框架的使用

1.1、安装Djnago Web框架

使用pip安装,命令如下

pip install django == 2.2   # 安装 2.2版本的Django

1.2、什么是virtualenv及windows下如何配置

virtualenv是一个创建隔绝的Python环境的工具。virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包。简单的说就是一个隔绝的python环境,在开发不同的程序的时候,往往需要在不同的环境下开发,每个应用可能需要各自一套"独立"的运行环境, virtualenv就是为此而生,用来创建一套这样的"隔离"的运行环境. virtualenv其操作简单,在大多数IDE中能容易的嵌合。最简单的说法就是Virtualenv 是Python中的虚拟环境管理工具。

windows下如何配置virtualenv,参考这篇文章

1.3、创建Django项目

1.31、使用django-admin命令创建项目

django-admin startproject demo

创建完成后,有以下几个文件

在这里插入图片描述

文件说明

文件 说明
manage.py Django程序执行入口
db.sqlite3 SQlite的数据库文件,Django默认使用这种小型数据库存取数据,非必须保留
template Django生成的HTML模板文件夹,我们也可以在每个App中使用模板文件夹
demo Django生成的和项目同名的配置文件夹
setting.py Django总的配置文件,可以配置App、数据库、中间件等选项
urls.py Django默认的路由配置选项
wsgi.py Django实现的WSGI接口的文件,用来处理Web请求

1.32、运行项目

使用以下命令

python manage.py runserver

然后根据提示可得web服务器已经在监听8000端口的请求。在浏览器中输入http:/127.0.0.1:8000就可以看到创建的Django项目界面。

1.33、创建数据表及账号密码

使用以下命令

python manage.py migrate                             # 执行数据库迁移生成的数据表
python manage.py createsuperuser                     # 按照提示输入账号密码,密码强度符号一定要求

然后重启启动服务器,在浏览器中访问http:/127.0.0.1:8000/admin,使用刚刚创建的账号密码就可以登入后台

1.4、创建App

在命令行使用以下代码

python manage.py startapp app1

在这里插入图片描述
demo目录里会多了app1目录
在这里插入图片描述
Django项目中App目录的文件说明

文件 说明
migrations 执行数据库迁移生成的脚本
admin.py 配置数据库迁移生成的脚本
apps.py 单独配置添加的每个App的文件
models.py 创建数据库数据模型对象的文件
tests.py 用来编写测试脚本的文件
views.py 用来编写视图控制器的文件

接下来将创建的APP添加到demo目录下的setting.py配置文件里,将其激活(否则APP目录不生效)
激活命令如下

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',
]

1.5、数据模型(models)

1.51、在App中添加数据模型

在app1的models.py中添加以下代码

from django.db import models

# Create your models here.


class Person(models.Model):
    
    """
    编写Person模型类,数据模型应该继承models.Model或者其子类
    """
    # 第一个字段使用models.CharFiles类型
    first_name = models.CharField(max_length=30)
    # 第二个字段使用models.CharFiles类型
    last_name = models.CharField(max_length=30)

Person模型中的每一个属性都指明了models下面的一个数据类型,代表了数据库中的一个字段。上面的类在数据库中会创建以下的表:

    CREATE TABLE myapp_person (
            "id" serial NOT NULL PRIMARY KEY,
            "first_name" varchar(30) NOT NULL,
            "last_name" varchar(30) NOT NULL
            );

1.52、执行数据库迁移

在完成数据库模型的建立后,我们希望使用mysql数据库,而不是Django自带的SQLite数据库。我们要使用MySql数据库,需要进行一下操作
1、进行setting.py配置
把下面代码注释掉

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  }
 }

然后再添加下面代码

DATABASES = {
    'default':{
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'demo',   # 数据库名称
        'USER': 'root',     # 用户名
        'PASSWORD': '密码',
    }
}

2、连接mysql数据库,然后在mysql命令行中创建数据库

create database demo default character set utf8;

3、安装数据库驱动

pip install pymysql

4、在D:\Python\Webprojects\l_env\Scripts\demo\demo目录下的__init__.py文件的手行添加下面代码

import pymysql
pymysql.install_as_MySQLdb()  # 为了将pymysql发挥最大数据库操作性能

5、生成迁移文件

python manage.py makemigrations     

这边报错

raise improperlyconfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % database._version_)

然后在D:\Python\Webprojects\l_env\Lib\site-packages\django\db\backends\mysql目录下找到base.py文件,然后将下面代码注释

#if version < (1, 3, 3):
#    raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

然后继续尝试又报错

File “%s\django\db\backends\mysql\operations.py”, line 146, in last_executed_query
query = query.decode(errors=‘replace’)

在同样的目录下,找到\operations.py文件,
注释下面2行代码

#if query is not none:
#  query = query.decode(errors='replace')

6、迁移数据库,创建新表

python manage.py migrate

报错raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc
原因:
Django2.1不再支持MySQL5.5,必须5.6版本以上

查mysql版本和Django版本:
show version()
import django
解决办法
二选一

(1)Django降级到2.0

pip install Django==2.0.0 -i https://pypi.douban.com/simple
(2)MySQL升级

参考:http://www.cnblogs.com/yebaofang/p/9863678.html

1.53、了解Django数据API

这里所有的命令都是在Django的交互命令行中执行。
在项目根目录下,启用交互命令行

python manage.py shell

导入数据模块

from app1.models import Person, Order  # 导入Person, Order模块

创建数据方法1

 p = Person(first_name="hugo",last_name="张") 
 p.save() # 必须调用save()才能写入数据库

方法2

p = Person.objects.create(first_name="hugo",last_name="张")

查询数据方法

 Person.objects.all()   # 查询所有数据

 Person.objects.get(first_name="hugo") # 查询单个数据,get方法只能返回一个确定值

查询指定条件的数据

Person.objects.filter(first_name__exact="hugo")   # 指定first_name字段值必须为hugo
Person.objects.filter(first_name__iexact="hugo")   # 不区分大小写

Person.objects.filter(id_get=1)      # 查找所有id值大于1
Person.objects.filter(id_lt=100)     # 查找所有id值小于100

# 排除所有创建时间大于现在的时间的,exclude的用法与filter正好相反
Person.objects.exclude(created_at__gt=datetime.datetime.now(tz=datetime.timezone.utc))
# 过滤出所有first_name中包含h的字段,然后将查询结果按照id进行排序
 Person.objects.filter(first_name__contains="h").order_by('id')
  # 查询所有first_name中不包含h的字段
 Person.objects.filter(first_name__icontains="h").order_by('id')

修改数据前需要先查询数据

p = Person.objects.get(first_name="hugo")

然后开始修改数据

p.first_name = "john"
p.last_name = "wang"
p.save()
或者
p, is_created = Person.objects.get_or_create(
	first_name = "hugo",
	defaults={"last_name":"wr"}
)

删除数据同样需要先找到对应的数据,然后进行删除

Person.objects.get(id=1).delete()
(1,({'app1.Person':1}))

一般情况我们不会直接删除数据,而是在数据模型定义的时候加个status参数,值为True或者False,用来标记是否可用,True为可用

1.6、路由(urls)

1.61、Django的URL路由流程如下

1、Django查找全局urlpaterns变量(urls.py)
2、按先后顺序对URL逐一匹配urlpaterns每个元素
3、匹配到第一个时停止查找,然后执行对应的处理函数
4、如果没有匹配到或出现异常,则由Django进行错误处理

1.62、Django支持的3种表达格式

1、精确字符串格式,如articles/1/。
一个精确URL匹配一个操作函数;最简单的形式,适合对静态URL的响应;URL字符串以“/”结尾,而不是开头。
2、Django的转化格式:<类型:变量名>,如articles/<int:year>/
Django转化后的格式是一个URL的模板,匹配URL的同时在其中获得一批变量作为参数是一种常用的形式。目的是通过URL进行参数的获取和匹配
格式转化类型说明表

格式转化类型 说明
str 匹配除分隔符(“/”)外的非空字符,默认类型<year>等价于<str.year>
int 匹配0和正整数
slug 匹配字母、数字、横杆、下划线组成的字符串,str子集
uuid 匹配格式化的UUID(UUID,通用唯一识别码,是由一组32位数的16进制数字所构成,可以产生一个号称全球唯一的ID,可以用来命名文件、变量以及数据库的ID主键等属于唯一的元素。)
path 匹配任何非空字符串,包括路径分隔符,是全集

1.63、Django支持正则表达式格式

这种情况下,前面必须是re_path函数,表达式必须是str格式,有2种使用形式
1、不提取参数:如“re_path(articles/([0-9]{4})/)”,表示4位数字,每一位都是0到9的任意数字
2、提取参数:命名格式为“(?p<name>pattern)”,如“re_path(articles/(?p<year>)[0-9]{4}/)”,将正则表达式提取的4为数字,每一位都是0-9的任意数字,命名为year。
未完待续。。。。。。

1.7、表单(forms)

在app1的文件下创建forms.py文件,添加下面代码

from app1 import views as app1_views
from django.urls import path, include
urlpatterns = [

    path('get_name', app1_views.get_name)
]

在views.py中编写

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from app1.forms import PersonForm
# Create your views here.


def get_name(request):
    # 判断请求方法是否为POST
    if request.method == 'POST':
        # 将请求数据填充到PersonForm实例中
        form = PersonForm(request.POST)
        # 判断form是否为有效的表单
        if form.is_valid():
            # s使用form.cleaned_data获取请求数据
            first_name = form.cleaned_data_data['first_name']
            last_name = form.cleaned_data_data['last_name']
            # 响应拼接后的字符串
            return HttpResponse(first_name + '' + last_name)
        else:
            return HttpResponseRedirect('/error/')
    # 请求GET方法
    else:
        return render(request, 'name.html', {'from': PersonForm})

把URl添加到按app1/urls.py中

path('get_name', app1_views.get_name)

在demo/urls.py中添加

path('app1/',include('app1.urls'))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章