python web开发

一、Django框架介绍与安装

框架介绍

1.什么是框架

        框架就是程序的骨架,主体结构,也是个半成品。

2.框架的优缺点

        可重用、成熟、稳健、易扩展、易维护

3.常见的框架

        Django

        web.py和Tornado

        Flask和Bottle

4.web框架中的一些概念

        MVC和MVT (model、view、template)

官方网址

        The web framework for perfectionists with deadlines | Django

Django框架安装

  • 建议使用命令安装

        pip3 install django==2.2.*

  • 检测当前是否安装Django及版本 

        python -m django --version 

查询pip3安装第三方库路径方式

pip3 show django

二、Django框架的快速入门 

第一步、项目的创建与运行

1)创建项目

django-admin startproject 项目名

2)运行开发服务器

进入manage.py文件的目录

python manage.py runserver

默认启动8000端口 ,在浏览器中输入127.0.0.1:8000,即可查看服务

启动8080端口

python manage.py runserver 8080

以上 启动方式只能本地访问

远程访问

在settings配置文件中设置,将ip加入ALLOWED_HOSTS中,*代表所有ip都可

ALLOWED_HOSTS = ["*"]
python manage.py runserver 0.0.0.0:8000

在浏览器中输入        ip:8000 即可访问 

第二部、应用的创建

1)创建一个应用程序

python manage.py startapp app名

结构目录

myweb/
├── manage.py
├── myweb
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── myapp
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

 admin.py                用于做后台的

apps.py                   当前应用的

migrations                做数据库迁移操作的

models.py                做数据库操作类的

tests.py                     做测试的

views.py                    做试图的

 2)编写视图

打开myapp/views文件

from django.shortcuts import render,HttpResponse

def index(request):

    return HttpResponse('欢迎使用')

在myapp中创建urls.py 文件

from django.urls import path

from . import views

urlpatterns = [
    path('',views.index,name='index'),
]

在myweb的urls.py中 导入include模块

from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),

    path('myapp/',include('myapp.urls')),
]

过程: 

        浏览器输入localhost:8000   ----->   myweb中的urls文件  ------>   通过include去myapp中urls   ------->   urlpatterns中path   ------->   找到views对应视图

 3)附录:path()函数介绍

        Django path()可以接受四个参数,分别是两个必选参数:route、view和两个可选参数:kwargs、name。

  •         route:是包含IURL模式的字符串。在处理请求时,Django从第一个模式开始。
  •         view:用于执行与正则表达式匹配的URL请求。
  •         kwargs:视图使用的字典类型的参数。
  •         name:用来反向获取URL。

第三步、项目的模型

1)连接MySQL数据库设置

        在myweb/settings.py文件中,通过DATABASES项进行数据库设置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydemo',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

其中ENGINE设置为数据库后端使用。内置数据库后端有:

  • 'django.db.backends.postgresql'
  • 'django.db.backends.mysql'           MYSQL数据库
  • 'django.db.backends.sqlite3'
  • 'django.db.backends.oracle' 

注意:

Django使用MySQL数据库需要加载 MySQLdb模块,需要安装 mysqlclient

pip install  mysqlclient

 如果命令安装不了,去以下地址, 选择自己对应的python版本和电脑位数

https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient

2) 创建模型

在app文件中的models.py文件中

class Stu(models.Model):
    '''自定义Stu表对应的Model类'''
    #定义属性:默认主键自增id字段可不写
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16)
    age = models.SmallIntegerField()
    sex = models.CharField(max_length=1)
    classid=models.CharField(max_length=8)

    # 定义默认输出格式
    def __str__(self):
        return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid)

    # 自定义对应的表名,默认表名:myapp_stu
    class Meta:
        db_table="stu"

 3) 激活模型app

编辑myweb/settings.py文件,并将该虚线路径添加到该INSTALLED_APPS设置。

INSTALLED_APPS  =  [ 
    'django.contrib.admin' ,
    'django.contrib.auth' ,
    'django.contrib.contenttypes' ,
    'django.contrib.sessions' ,
    'django.contrib.messages' ,
    'django.contrib.staticfiles' ,
    'myapp.apps.MyappConfig',  #或者直接写 myapp
]

通过命令将models的数据库生成到mysql中,数据库中便会有上述stu数据库表

python manage.py makemigrations
python manage.py migrate

4)启用网站admin管理        (了解

1。数据迁移

python manage.py migrate

附录makemigrations和migrate的作用

生成一个临时文件  python manage.py makemigrations  

这时其实是在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,但是数据库没有增加新的表

接着执行migrate,这时候才真的把作用到数据库文件,产生对应的表

2。创建管理员用户

python manage.py createsuperuser

输入相关信息(结合自己) 

python web开发_第1张图片

3。启动服务,并通过浏览器访问admin        localhost:端口/admin

python web开发_第2张图片

 输入刚创建的账号、密码,即可登录

 4。设置时区和语言

在settings.py文件中,修改一下两个变量

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

 5。将我们自定义的应用程序加入到后台管理

开myapp/admin.py 文件,并编辑代码如下:

from django.contrib import admin

from myapp.models import Stu

admin.site.register(Stu)

6。更深入设计后台管理 

编辑myapp/models.py文件,在Stu类中添加如下信息,让后台管理显示中文字段

models.py

# 编辑myapp/models.py文件,在Stu类中添加如下信息,让后台管理显示中文字段。

class Stu(models.Model):
    '''自定义Stu表对应的Model类'''
    #定义属性:默认主键自增id字段可不写
    id = models.AutoField("学号",primary_key=True)
    name = models.CharField("姓名",max_length=16)
    age = models.SmallIntegerField("年龄")
    sex = models.CharField("性别",max_length=1)
    classid=models.CharField("班级",max_length=8)

    # 定义默认输出格式
    def __str__(self):
        return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid)

    # 自定义对应的表名,默认表名:myapp_stu
    class Meta:
        db_table="stu"
        verbose_name = '浏览学生信息'  
        verbose_name_plural = '学生信息管理'

编辑myapp/admin.py 文件,实现信息管理的个性化定制 

admin.py 

# 编辑myapp/admin.py 文件,实现信息管理的个性化定制

from django.contrib import admin

# Register your models here.
from myapp.models import Stu

#Stu模型的管理器(装饰器写法)
@admin.register(Stu)
class StuAdmin(admin.ModelAdmin):
    #listdisplay设置要显示在列表中的字段(id字段是Django模型的默认主键)
    list_display = ('id','name','age','sex','classid')

    #设置哪些字段可以点击进入编辑界面
    list_display_links = ('id','name')

    #list_per_page设置每页显示多少条记录,默认是100条
    list_per_page = 10

    #ordering设置默认排序字段,负号表示降序排序
    ordering = ('id',)  #-id降序

    #list_editable 设置默认可编辑字段
    #list_editable = ['age','sex','classid']

    #其他请详见手册文档说明

三、Django的URL路由

1)Django如何处理一个请求

1.settings.py文件中

ROOT_URLCONF = '项目名.urls'

 2.urls.py文件中  urlpatterns

    通过django.urls.path()和django.urls.re_path()

    path(地址,程序)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/',include('myapp.urls')),
]

3.按照顺序匹配每个path

4.views.py文件

5.如果匹配不到报404异常

说明:

  • 要从URL捕获一个值,请使用尖括号括起来
  • 捕获的值可以选择包括转换器类型。例如,用于 捕获整数参数。如果不包括转换器/,则匹配除字符以外的任何字符串。

路径转换器

  • 默认情况下,以下路径转换器可用:

  • str 匹配任何非空字符串,但路径分隔符除外'/'。如果表达式中不包含转换器,则为默认设置。
  • int 匹配零或任何正整数。返回一个int。
  • slug 匹配由ASCII字母或数字以及连字符和下划线字符组成的任何条形字符串。例如, building-your-1st-django-site。
  • uuid 匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号并且字母必须小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。
  • path 匹配任何非空字符串,包括路径分隔符 '/'。这样,您就可以匹配完整的URL路径,而不是像一样匹配URL路径的一部分str。
通过浏览器访问服务
    127.0.0.1:8000/abc ==>  root url(根路由) ==> 加载子路由(myweb/urls.py)

    ==> 正则匹配访问的路径(path) =-=> 视图函数(views.index)

    ==> views.py index() 响应内容

 示例

sid=0,name=""  当访问find/后面没有参数是    默认sid等于0,name为空

urlpatterns = [
    path('find/',views.find),
    path('find/',views.find),
    path('find//',views.find),
]
def find(request,sid=0,name=""):

    return HttpResponse("find....%d:%s"%(sid,name))

2)使用正则表达式

  • 使用re_path() 代替 path()        导入模块re_path
  • (?Ppattern) 表示views的函数中变量名必须是name
  • 开头r  结尾$
re_path(r'^fun/(?P[0-9]{4})/(?P[0-9]{2})$',views.fun),
def fun(request,yy,mm):
    return HttpResponse("参数信息:%s年%s月"%(yy,mm))

python web开发_第3张图片

 3)关于404错误

1.在settings中

DIRS如下设置

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',

            ],

        },

    },

]

2.在myweb同级目录下创建templates文件夹,并创建404.html文件

    404

   

       

404 not found

       

{{exception}}

   

3.将settings中,DEBUG设置为False

DEBUG = False

4.将settings中主机名设置为*

ALLOWED_HOSTS = ["*"]

4)包括其他的url路由

总路由文件,导入include

from django.urls import include

urlpatterns = [
    path('myapp/',include('myapp.urls')),
]

在myapp中创建子路由urls.py

#myapp应用的路由
from django.urls import path,re_path
from . import views

urlpatterns = [
    path('',views.index,name='index'),
    path('add/',views.add),
    path('find/',views.find),
    path('find/',views.find),
    path('find//',views.find),
    re_path(r'^fun/(?P[0-9]{4})/(?P[0-9]{2})$',views.fun),
    path('edit/',views.update),
]

5)url的反向解析

1 2根据应用路由中,name变量找到路由

python web开发_第4张图片

打印出来的结果是   /myapp/add/ 

from django.urls import reverse

def index(request):
    print(reverse('add'))    #由reverse通过路由名称反向生成url请求地址
    return HttpResponse('欢迎使用')

2 跳转页面 

输入index视图的url后,跳转到add页面

def index(request):
    return redirect(reverse('add'))    #执行浏览器重定向

 四、Django的模型层

Model模型

模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。

通常,每个模型对应数据库中唯一的一张表。

  • 每个模型都是django.db.models.Model的一个Python 子类。
  • 模型的每个属性都表示为数据库中的一个字段。
  • Django 提供一套自动生成的用于数据库访问的API;
  • 这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳

模型与数据库的关系

模型(Model)负责业务对象和数据库的关系映射(ORM)

        一个模型对应数据库中的一张表

        一个属性对应一个字段

为什么要用模型?

Model是MVC框架中重要的一部分,主要负责程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据

它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库

 开发流程

  • 在models.py中定义模型类,要求继承自models.Model

        class Meta中可以设置数据库表名,如果不设置表明默认是        app名_类名(小写)

from django.db import models
from datetime import datetime

# Create your models here.
class Users(models.Model):
 #id = models.AutoField(primary_key=True) #主键可省略不写
 name = models.CharField(max_length=32)
 age = models.IntegerField(default=20)
 phone = models.CharField(max_length=16)
 addtime=models.DateTimeField(default=datetime.now)

#class Meta:
#    db_table = "myapp_users_1"  # 指定表名
  • 生成迁移文件
python manage.py makemigrations

如果出现下面错误

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No mo
dule named 'MySQLdb'.
Did you install mysqlclient or MySQL-python?

解决 

pip install mysqlclient

若执行python manage.py makemigrations命令(也可能人比较皮,把migrations文件夹给删了),会提示"No changes detected." 可能有用的解决方式如下:

先 python manage.py makemigrations --empty yourappname 生成一个空的initial.py
再 python manage.py makemigrations 生成原先的model对应的migration file
  • 执行迁移 
python manage.py migrate
  • 使用模型类进行crud操作 

定义模型

模型实列

        save

        delete

模型查询

        1.查询集

        2.字段查询

你可能感兴趣的:(django,django,python,1024程序员节)