文档章节

一、Django基础

ZeroBit
 ZeroBit
发布于 10/13 23:34
字数 1796
阅读 17
收藏 0

一、web框架分类和wsgiref模块使用介绍

web框架的本质

socket服务端 与 浏览器的通信

socket服务端功能划分:

  1. 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn...
  2. 根据用户访问不同的路径执行不同的函数 c. 从HTML读取出内容,并且完成字符串的替换 --> jinja2(模板语言)

Python中Web框架的分类:

  1. 按上面三个功能划分:

    1. 框架自带a,b,c --> Tornado
    2. 框架自带b和c,使用第三方的a --> Django
    3. 框架自带b,使用第三方的a和c --> Flask
  2. 按另一个维度来划分:

    1. Django --> 大而全(你做一个网站能用到的它都有)
    2. 其他 --> Flask 轻量级

二、Django安装及创建项目

安装Django

pip3 install django==版本号(1.11.11/2.2.6)
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ django==版本号(1.11.11/2.2.6)

命令行创建项目

django-admin startproject project名称

pycharm创建项目

File --> New project --> 左侧选Django --> 右侧填项目路径

设置Django项目:

  1. manage.py:项目管理入口文件

  2. settings.py:

1. 配置HTML文件存放的位置
	Templates(存放HTML文件的配置) <-- 告诉Django去哪儿找我的HTML文件
2. 配置静态文件存放的位置
	# 静态文件保存目录的别名
	STATIC_URL = '/static/' # 所有静态文件(css/js/图片)都放在我下面你配置的文件夹中
	STATICFILES_DIRS = [
		os.path.join(BASE_DIR, "static"),
	]
3. 配置中文及时区
	LANGUAGE_CODE = 'zh-hans'
	TIME_ZONE = 'Asia/Shanghai'
4. INSTALLED_APPS # 告诉Django有哪些APP
  1. urls.py: 保存了路径和函数的对应关系

Django项目的启动

  1. 命令行启动
在项目的根目录下(也就是有manage.py的那个目录),运行:
python3 manage.py runserver IP:端口--> 在指定的IP和端口启动
python3 manage.py runserver 端口   --> 在指定的端口启动
python3 manage.py runserver        --> 默认在本机的8000端口启动
  1. PyCharm启动
点绿色的小三角,直接可以启动Django项目(前提是小三角左边是你的Django项目名)

Django WEB请求流程(简版)

  1. 启动Django项目,等待用户连接
  2. 浏览器在地址栏输入URL,来连接我的Django项目
  3. 在urls.py中 找 路径和函数的 对应关系
  4. 执行对应的函数
  5. 返回响应

三、Django中的APP

什么是APP?以及为什么要用APP?

方便我们在一个大的Django项目中,管理实现不同的业务功能.

project  --> 项目  (大学校)
APP      --> 应用  (Linux学院/Python学院/大数据学院/Java学院)

创建APP的命令

命令行,在Django项目的根目录输入: python3 manage.py startapp app名字

四、urls.py路由

  1. 不带参数的请求
path('admin/', admin.site.urls)
  1. 带参数的请求
path('solution/<int:变量名>/', views.ListSolution.as_view(), name="solutionList"),

五、views.py视图

专门用来定义处理请求的函数

基本必备三件套 from django.shortcuts import HttpResponse, render, redirect

  1. HttpResponse("要返回的内容") --> 通常用于直接返回数据
  2. render(request, "html文件", {"k1": v1}) --> 返回一个HTML文件或者打开文件进行字符串替换
  3. redirect("URL") --> 告诉用户的浏览器去访问其他的URL

request相关

  1. GET请求和POST请求
GET请求:
	1. 浏览器请求一个页面
	2. 搜索引擎检索关键字的时候
	3. a标签
POST请求:
	1. 浏览器向服务端提交数据,比如登录/注册等
	2. 修改(新增)大段的数据
	3. 上传文件
  1. GET请求URL传值
127.0.0.1:8000/user/?变量名=变量值
  1. 获取request请求的方法
request.method == "GET"/"POST"
  1. 获取GET请求参数
request.GET.get(变量名, 默认值)
  1. 获取POST请求参数
request.POST.get(name的变量名, 默认值) # 获取单个值
request.POST.getlist(name的变量名) # 获取多选列表值

六、ORM模型(Model)

ORM的对应关系

类 ---> 数据表 对象 ---> 数据行 属性 ---> 字段

ORM能做的事儿

  1. 操作数据表 --> 创建表/删除表/修改表(操作models.py里面的类)
  2. 操作数据行 --> 数据的增删改查

使用Django的ORM连接MySQL的详细步骤:

  1. 自己动手创建数据库:create database 数据库名;

  2. 在Django项目中设置连接数据库的相关配置(settings.py 告诉Django连接哪一个数据库)

# 数据库相关的配置
DATABASES = {
	'default': { 'ENGINE': 'django.db.backends.mysql', # 连接的数据库类型 
	'HOST': '127.0.0.1', # 连接数据库的地址 
	'PORT': 3306, # 端口 
	'NAME': "day61", # 数据库名称 
	'USER': 'root', # 用户 
	'PASSWORD': '123456' # 密码 
	}
}
  1. 在app下面的models.py文件中定义一个类,这个类必须继承models.Model
class 类名(models.Model): 
	...
  1. 执行两个命令
python3 manage.py makemigrations # 新建Model或Model有改动时需要执行
python3 manage.py migrate # 把更改翻译成SQL语句,去数据库执行

在app/models.py里面定义类

一个简单的Model示例:

# 出版社
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)  # 自增的ID主键
    # 创建一个varchar(64)的唯一的不为空的字段
    name = models.CharField(max_length=64, null=False, unique=True)

ORM单表的增加和查询

  1. 查询
models.UserInfo.objects.all() # 查询所有
  1. 增加
models.UserInfo.objects.create(字段名=字段值)
  1. 删除
solution = Solution.objects.get(id=id) # 先获取对象
solution.delete() # 再删除
# 或
Solution.objects.get(id=id).delete()
  1. 修改
solution = Solution.objects.get(id=id) # 先获取对象
solution.字段名 = 字段值 # 修改某个字段的值
solution.save() # 保存修改

一对多、多对多模型

  1. 关系:
1. 一本书   只能   有一个出版社
2. 一本书   能有   多个作者
3. 一个作者 能写   多本书

出版社和书: 一对多    --> 外键
书和作者:   多对多    --> 用第三张表做关联

  1. 一对多关系操作
# 出版社
class Publisher(models.Model):
	id = models.AutoField(primary_key=True)  # 自增的ID主键
	# 创建一个varchar(64)的唯一的不为空的字段
	name = models.CharField(max_length=64, null=False, unique=True)
	addr = models.CharField(max_length=128)
# 书
class Book(models.Model):
	id = models.AutoField(primary_key=True)  # 自增的ID主键
	# 创建一个varchar(64)的唯一的不为空的字段
	title = models.CharField(max_length=64, null=False, unique=True)
	# 和出版社关联的外键字段
	publisher = models.ForeignKey(to="Publisher")

# 增加
new_book_obj = models.Book.objects.create(
    title="新书的名字",
    # publisher=publusher_obj,
    publisher_id=7
)

# 修改
book_obj = models.Book.objects.get(id=9)
book_obj.title=request.POST.get("book_title")
book_obj.publisher_id=9
book_obj.save()
  1. 多对多关系操作
# 作者表
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, null=False, unique=True)
    # 告诉ORM 我这张表和book表是多对多的关联关系,ORM自动帮我生成了第三张表
    book = models.ManyToManyField(to="Book")

    def __str__(self):
        return "<Author Object: {}>".format(self.name)

# 增加
# 取到提交的数据
new_author_name = request.POST.get("author_name")
# post提交的数据是多个值的时候一定会要用getlist,如多选的checkbox和多选的select
books = request.POST.getlist("books")
# 创建作者
new_author_obj = models.Author.objects.create(name=new_author_name)
# 把新作者和书籍建立对应关系,自动提交
new_author_obj.book.set(books)

Template模板

取值

{{ 变量名 }}

循环

{% for user in user_list %}
...
{% endfor %}

循环计数

{{ forloop.counter }}

最后一次循环

{{ forloop.last }}

判断

{% if book_obj.publisher_id == publisher.id %}
{#  当前书籍关联的出版社才默认选中#}
<option selected value="{{ publisher.id }}">{{ publisher.name }}</option>
{% else %}
{# 其他的出版社不选中 #}
<option value="{{ publisher.id }}">{{ publisher.name }}</option>
{% endif %}
{# 如果当前这本书 在 当前作者关联的所有书 里面 #}
{% if book in author.book.all %}
<option selected value="{{ book.id }}">{{ book.title }}</option>
{% else %}
<option  value="{{ book.id }}">{{ book.title }}</option>
{% endif %}

© 著作权归作者所有

ZeroBit

ZeroBit

粉丝 1
博文 64
码字总数 63279
作品 0
南宁
私信 提问
华为的测试大牛Python+Django接口自动化怎么写的?

最近被几个公司实习生整自闭了,没有基础,想学自动化又不知道怎么去学,没有方向没有头绪,说白了其实就是学习过程中没有成就感,所以学不下去。出于各种花里胡哨的原因,今天给大家整一个简...

程序猿拿Q
04/11
501
0
Django 最佳学习路径 | 涵盖众多学习资源

学习编程的路上, 下面的场景你是否似曾相识? ———— 场景一 当初,零编程基础,想做个网站。听说Python能做网站,而且很屌,于是我去学了Python。 结果发现他们都是在Linux下写代码,于是...

图灵教育
03/20
0
0
史上最友好的 Django 入门教程

Django是使用Python开发的开源Web开发框架。使用Django,你能以最小的代价构建和维护高质量的Web应用。 我们参考Django 官方文档,制作了一门新手更容易理解的Django 基础教程 ,帮助大家更好...

实验楼
2018/07/26
0
0
Python(Django)项目与Apache的管理交互

(开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python)、Apache、Wsgi(必须文件) 首先需要电脑有Python基础下并且安装好Django的环境,下...

jamesjoshuasss
2018/05/14
0
0
和lock一起学beego 博客系统开发为例(三)

mongodb: MongoDB(二):基础知识 Django学习笔记:为Model添加Action 和lock一起学beego 博客系统开发为例(三) 深入Go语言 - 1 django captcha imagintft: 关于captcha使用The _imagingft C ...

d_watson
2016/06/16
23
0

没有更多内容

加载失败,请刷新页面

加载更多

BigDecimal 去后面无用的0的方法

BigDecimal a=new BigDecimal("0.1000"); System.out.println(a.stripTrailingZeros().toPlainString());...

xiaodong16
39分钟前
5
0
JAVA--高级基础开发

[集合版双色球] 十二、双色球规则:双色球每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1—33中选择;蓝色球号码从1—16中选择;请随机生成一注双色球号码。(要求同色号码...

李文杰-yaya
昨天
19
0
聊聊rocketmq broker的CONSUMER_SEND_MSG_BACK

序 本文主要研究一下rocketmq broker的CONSUMER_SEND_MSG_BACK CONSUMER_SEND_MSG_BACK rocketmq/common/src/main/java/org/apache/rocketmq/common/protocol/RequestCode.java public class......

go4it
昨天
4
0
API常见接口(下)

system类 StringBuilder和StringBuffer 包装类 1.System类 (java.lang包中) 提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。 常用方法: public static long currentTimeMi...

Firefly-
昨天
4
0
MySQL系列:一句SQL,MySQL是怎么工作的?

对于MySQL而言,其实分为客户端与服务端。 服务端,就是MySQL应用,当我们使用net start mysql命令启动的服务,其实就是启动了MySQL的服务端。 客户端,负责发送请求到服务端并从服务端获取数...

杨小格子
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部