day 61 Django part-1 django的安装,以及初学者三件套

老师的笔记:

day61

1.前情回顾
    1. pymysql

        使用:
            安装 pip install pymysql
            导入 import pymysql

            具体使用:
                1. 创建连接  conn = pymysql.connect(host="lcoalhost", port=3306, user="", password="", database="", charset="utf8")
                2. cursor = conn.cursor()
                3. cursor.execute(sql, (arg1, arg2 ...))   --> SQL注入问题

                4. 增删改查
                    增:
                    cursor.execute("insert into ...", (arg1, arg2...))
                    conn.commit()    --> 向数据库提交
                    cursor.lastrowid   --> 获取刚插入的那条数据的ID

                    删:
                    cursor.execute(“delete ...”, (arg1, arg2...))
                    conn.commit()    --> 向数据库提交

                    改:
                    cursor.execute("update ...”, (arg1, arg2...))
                    conn.commit()    --> 向数据库提交

                    查:
                    cursor.execute(“select ...”, (arg1, arg2...))

                    cursor.fetchone()   --> 查单条数据,元组类型
                    cursor.fetchmany(n) --> 查多条数据
                    cursor.fetchall()   --> 查所有数据

                    cursor.scroll(n, mode="relative")  --> 相对移动
                    cursor.scroll(n, mode="absolute")  --> 绝对移动

                    批量执行:
                    cursor.executemany("update ...”, ((arg1, arg2),(arg1, arg2),(arg1, arg2)))
                    conn.commit() 

                    回滚:
                    try:
                        cursor.execute("update ...”, (arg1, arg2...))
                        conn.commit()    --> 向数据库提交
                    except Exception as e:
                        logging.error(str(e))
                        conn.rollback()

                    cursor.close()
                    conn.close()
2. 今日内容
    Web框架(绝大部分内容)

    浏览器 socket客户端
        4. 客户端连接服务端
        5. send()  客户端发数据

        8. recv()  接收服务端回复的数据
        9. close() 关闭链接    

    博客园服务器 socket服务端
        1. bind IP和端口
        2. listen() 监听
        3. accept() 等待连接

        6. recv()  接收数据
        7. send()  回复数据

        FTP上传文件的:
            msg = "upload|filename|1024"

            服务端解析:
            msg.split()

        -> 浏览器和你的web服务端通信需要遵循一个规则,这个规则就是HTTP协议。

        HTTP协议:
            简单的理解成 规定了消息的格式

        浏览器发送  ---> 请求 (request)
        服务端回复  ---> 响应 (response)

        请求和响应的格式:
            Header (头)\r\n\r\n
            Body   (体)

            请求:

                GET请求的格式: 只有请求头没有请求体
                    "GET / HTTP/1.1\r\n
                    k1:v1\r\n
                    k2:v2\r\n
                    ....

                    "
                POST请求的格式:
                    "POST / HTTP/1.1\r\n
                    k1:v1\r\n
                    k2:v2\r\n
                    ....

                    "
                    Body

            响应:
                Header

                Body

        渲染 (render)

            本质上:
                用数据去替换HTML页面中的特殊字符

            jinja2 Flask

    总结:

        自己定义的web框架
            a. 自己写socket处理请求相关的数据(web服务端) wsgiref uWSGI gunicorn

            WSGI协议:
                Python Web服务端和Python 应用程序之间通讯的一个标准

            b. URL -> 函数 --> 函数里面写业务逻辑(取到数据)

            c. 把数据填充到HTML页面(字符串替换)

        分类:
            1. a、b、c都是用自己的       --> Tornado
            2. a用别人的,b和c用自己的   --> Django
            3. a和c都用别人的,b用自己的 --> Flask

        另外一个维度的分类:
            1. Django (大而全)
            2. 其他   (小而精)

    Django:
        安装:
            pip install django==1.11.9

        新建Django项目:
            命令行方式:
                > 先进入到你新建的项目要存放的目录
                > django-admin startproject s8
                > cd s8
                > python manage.py runserver
            PyCharm方式:
                File -> new project -> 选Django -> 起名字 -> 点右下角create

        启动Django项目:
            命令行方式:
                python manage.py runserver 127.0.0.1:8888
                python manage.py runserver 8888
            PyCharm方式启动:(PyCharm单独打开你的Django项目)
                1. 点页面上方中部位置的绿色小三角 直接运行

            Ctrl + C 停止

        Django项目目录结构:
            s8
                -s8
                    -settings.py
                    -urls.py     URL --> 函数的对应关系
                    -wsgi.py
                -manage.py  

        新手必备三件套:
            from django.shortcuts import HttpResponse, render, redirect

        跟request相关的方法:
            request.method
            request.POST
                request.POST.get("key")  --> 获取对应的值

        新建Django项目三件事:
            1.注释csrf那一行
            2. 配置静态文件
            3. 检查templates配置项

3. 今日作业
    把你之前用Bootstrap写的那个登录页面,用Django跑起来
    1. 静态文件的摆放位置 ******
    2. 登陆用POST提交数据,使用pymysql去数据库里取用户数据校验
    3. 登陆成功跳转到 http://www.luffycity.com
    4. 登录失败就返回当前页面

http://www.cnblogs.com/liwenzhou/p/8258992.html

我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。

import socket

sk = socket.socket()
sk.bind(("127.0.0.1", 80))
sk.listen(5)

while True:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    conn.send(b"OK")
    conn.close()

web的框架是上面的客户端和服务端,这就是本质的东西

所以,必须有一个统一的规则,让大家发送消息、接收消息的时候有个格式依据,不能随便写。

这个规则就是HTTP协议,以后浏览器发送请求信息也好,服务器回复响应信息也罢,都要按照这个规则来。

HTTP协议主要规定了客户端和服务器之间的通信格式,那HTTP协议是怎么规定消息格式的呢?

让我们首先看下我们在服务端接收到的消息是什么。

然后再看下我们浏览器收到的响应信息是什么。

响应头在浏览器的network窗口可以看到,我们看到的HTML页面内容就是响应体。本质上还是字符串,因为浏览器认识HTML,所以才会渲染出页面。

HTTP协议介绍

每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。 HTTP响应的Header中有一个 Content-Type表明响应的内容格式。如 text/html表示HTML网页。

HTTP GET请求的格式:

GET /path HTTP/1.1
header1:v1\r\n
header2:v2\r\n

使用 \r\n分隔多个header

HTTP POST请求格式:

POST /path HTTP/1.1
header1:v1\r\n
header2:v2\r\n
\r\n\r\n
请求体...

当遇到连续两个 \r\n\r\n时,表示Header部分结束了,后面的数据是Body。

HTTP响应的格式:

200 OK
Header1:v1\r\n
Header2:v2\r\n
\r\n\r\n
响应体...

让我们的Web框架在给客户端回复响应的时候按照HTTP协议的规则加上响应头,这样我们就实现了一个正经的Web框架了。

这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。

这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。

不管是什么内容,最后都是转换成字节数据发送出去的。 我可以打开HTML文件,读取出它内部的二进制数据,然后发送给浏览器。

我们通过了socket连接就打开了一个HTML文件,

from wsgiref.simple_server import make_server

def index():
    with open("index.html", "rb") as f:
        data = f.read()
    return [data, ]

def home():
    with open("home.html", "rb") as f:
        data = f.read()
    return [data, ]

# 定义一个url和函数的对应关系
URL_LIST = [
    ("/index/", index),
    ("/home/", home),
]

def run_server(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html;charset=utf8‘), ])  # 设置HTTP响应的状态码和头信息
    url = environ[‘PATH_INFO‘]  # 取到用户输入的url
    func = None  # 将要执行的函数
    for i in URL_LIST:
        if i[0] == url:
            func = i[1]  # 去之前定义好的url列表里找url应该执行的函数
            break
    if func:  # 如果能找到要执行的函数
        return func()  # 返回函数的执行结果
    else:
        return [bytes("404没有该页面", encoding="utf8"), ]

if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, run_server)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()

这是一个简单的动态,我完全可以从数据库中查询数据,然后去替换我html中的对应内容,然后再发送给浏览器完成渲染。 这个过程就相当于HTML模板渲染数据。 本质上就是HTML内容中利用一些特殊的符号来替换要展示的数据。 我这里用的特殊符号是我定义的,其实模板渲染有个现成的工具: jinja2

from wsgiref.simple_server import make_server
from jinja2 import Template

def index():
    with open("index2.html", "r") as f:
        data = f.read()
    template = Template(data)  # 生成模板文件
    ret = template.render({"name": "Alex", "hobby_list": ["烫头", "泡吧"]})  # 把数据填充到模板里面
    return [bytes(ret, encoding="utf8"), ]

def home():
    with open("home.html", "rb") as f:
        data = f.read()
    return [data, ]

# 定义一个url和函数的对应关系
URL_LIST = [
    ("/index/", index),
    ("/home/", home),
]

def run_server(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html;charset=utf8‘), ])  # 设置HTTP响应的状态码和头信息
    url = environ[‘PATH_INFO‘]  # 取到用户输入的url
    func = None  # 将要执行的函数
    for i in URL_LIST:
        if i[0] == url:
            func = i[1]  # 去之前定义好的url列表里找url应该执行的函数
            break
    if func:  # 如果能找到要执行的函数
        return func()  # 返回函数的执行结果
    else:
        return [bytes("404没有该页面", encoding="utf8"), ]

if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, run_server)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()

我们先安装上django

然后了解它的工作原理,

然后掌握它的一些用法,

最后使用它实现一些简单的小功能

安装(安装最新LTS版):

pip3 install django==1.11.9

我们安装的时候可以就在pycharm里面进行就可以,

创建一个django项目:

下面的命令创建了一个名为"mysite"的Django 项目:

django-admin startproject mysite

我们的静态文件,就是static文件里面的,那些css,js,以及jQuery文件,还有图片之类的

而我们的HTML文件是放在

TEMPLATES这个文件里面的 
from django.shortcuts import HttpResponse, render, redirect

这三个,是核心内容django里面的核心

HttpResponse

内部传入一个字符串参数,返回给浏览器。

例如:

def index(request):
    # 业务逻辑代码
    return HttpResponse("OK")

render

除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。

将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上面用到的jinja2)

例如:

def index(request):
    # 业务逻辑代码
    return render(request, "index.html", {"name": "alex", "hobby": ["烫头", "泡吧"]})

redirect

接受一个URL参数,表示跳转到指定的URL。

例如:

def index(request):
    # 业务逻辑代码
    return redirect("/home/")

目录介绍:

mysite/
├── manage.py  # 管理文件
└── mysite  # 项目目录
    ├── __init__.py
    ├── settings.py  # 配置
    ├── urls.py  # 路由 --> URL和函数的对应关系
    └── wsgi.py  # runserver命令就使用wsgiref模块做简单的web server

原文地址:https://www.cnblogs.com/2012-dream/p/8269914.html

时间: 2024-07-29 16:01:10

day 61 Django part-1 django的安装,以及初学者三件套的相关文章

django+xadmin在win7-64bit下安装记录

### django+xadmin在win7-64bit下安装简单记录 1.下载python: https://www.python.org/ftp/python/2.7.12/python-2.7.12.amd64.msi 安装 python-2.7.12.amd64.msi   # 注释选择安装路径,这里是:D:\ProgramFiles\Python27 2.配置环境变量Path里:  # 计算机->右键->高级系统设置->高级->环境变量->修改Path,加入: D:

Django遇到问题:pip安装了django,但是还是提示ModuleNotFoundError: No module named 'django'

原因django安装的包不在python的默认路径下. 方法: 1.查看python路径 2.找到pip安装的路径 3.加入PATHONPATH [[email protected] ~]# PYTHONPATH="/usr/local/lib/python3.6/site-packages"[[email protected] ~]# export PYTHONPATH Django遇到问题:pip安装了django,但是还是提示ModuleNotFoundError: No mod

Django入门第一步(安装和创建一个简单的项目)

目录 Django入门第一步(安装和创建一个简单的项目) 一. Django项目目录结构 二.注意事项 三.Django安装 3.1.安装命令 3.2.验证django是否安装成功 3.3.使用方法 Django入门第一步(安装和创建一个简单的项目) 在使用Django框架开发web应用程序时,开发阶段同样依赖wsgiref模块来实现Server的功能,我们使用Django框架是为了快速地开发application. 如果使用的是我们自定义的框架来开发web应用,需要事先生成框架包含的一系列基础

Django部署:Django+gunicorn+Nginx环境的搭建

本人的服务器环境为Ubuntu14.04,使用的是Python3.4版本,并且安装有pip(Ubuntu中Python3配合的是pip3),并且以管理员身份运行,如果是普通用户,请切换管理员权限(sudo). 一.gunicorn和nginx的简介 gunicorn需要搭配nginx使用,那么两者的作用到底是什么. 1.gunicorn简介:gunicorn是一个Python WSGI UNIX服务器.WSGI(Web Server Gateway Interface)是Web服务网关接口,位于

使用Nginx+uWSGI+Django方法部署Django程序(下)

在上一篇文章<五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)>中,阐述了如何只使用uWSGI来部署Django程序. 当然,单单只有uWSGI是不够的,在实际的部署环境中,Nginx是必不可少的工具. 在本篇文章中,我将一直延用“N步法”的风格来阐述如何将uWSGI与Nginx做连接来部署Django程序.并在最后,会较为完整的阐述本社区的部署方法. 本文大纲: 环境介绍 配置uWSGI 配置Nginx Nginx+uWSGI+Django的实现方式 一些建

【转】五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(下)

五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(下) By Django中国社区 at 2013-05-18 04:38 在上一篇文章<五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)>中,阐述了如何只使用uWSGI来部署Django程序. 当然,单单只有uWSGI是不够的,在实际的部署环境中,Nginx是必不可少的工具. 在本篇文章中,我将一直延用“N步法”的风格来阐述如何将uWSGI与Nginx做连接来部署Django程序.并

【转】五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)

五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上) By Django中国社区 at 2013-05-12 15:05 Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.nginx把所有静态请求自己来处理(这是NGINX的强项).然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,

使用Nginx+uWSGI+Django方法部署Django程序(上)

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.nginx把所有静态请求自己来处理 (这是NGINX的强项).然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求. 可见,uwsgi的作用就类似一个桥接器.起到桥梁的作用. NOTE:不使用nginx,只使用uwsgi+django也是可以

Django框架(一)-Django初识

Django初识 一.Web框架本质-自己实现Web框架 1.所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端 import socket sk = socket.socket() sk.bind(('127.0.0.1', 8888)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8192) conn.send(b'OK') conn.close() 2.增加HTT