• python django框架(一)


    s4day63内容回顾:

    1. 安装
    2. 创建用户 + 授权
    3.
    连接
    - 数据库
    终端创建数据库(字符编码)
    - 数据表
    终端
    ORM
    pymysql
    create ...)engine=innodb
    - 数据行




    - limit
    - group by
    ....

    关闭

    问题:简述ORM原理?

    day64内容

    1. 自己开发Web框架
    - socket
    - http协议
    - HTML知识
    - 数据库(pymysql,SQLAlchemy)

    HTTP特点:
    无状态、短连接

    TCP:
    不断开

    WEB应用(网站):
    Http协议:
    发送:
    POST /index HTTP/1.1
    Host: 127.0.0.1:8080
    Connection: keep-alive
    Cache-Control: max-age=0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
    HTTPS: 1
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: zh-CN,zh;q=0.8
    Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni


    p=123

    响应:
    200 OK
    Cache-Control:public, max-age=15
    Connection:keep-alive
    Content-Encoding:gzip
    Content-Type:text/html; charset=utf-8
    Date:Wed, 14 Jun 2017 01:21:17 GMT
    Expires:Wed, 14 Jun 2017 01:21:33 GMT
    Last-Modified:Wed, 14 Jun 2017 01:21:03 GMT
    Transfer-Encoding:chunked
    Vary:Accept-Encoding
    X-Frame-Options:SAMEORIGIN
    X-UA-Compatible:IE=10



    用户在页面看到的内容“字符串”(看到页面效果,由于浏览器解析)


    浏览器(socket客户端)
    2. www.cnblogs.com

    (42.121.252.58,80)
    sk.socket()
    sk.connect((42.121.252.58,80))

    sk.send('我想要xx')
    5. 接收
    6. 连接断开

    博客园(socket服务端)
    1. 监听ip和端口(42.121.252.58,80)
    while True:
    用户 = 等待用户连接
    3. 收到'我想要xx'
    4. 响应:“好”
    用户断开

    连接示例

    import socket
    
    sock = socket.socket()
    sock.bind(('127.0.0.1',8080))
    sock.listen(5)
    
    while True:
        conn,addr = sock.accept() # hang住
        # 有人来连接了
        # 获取用户发送的数据
        data = conn.recv(8096)
        conn.send(b"HTTP/1.1 200 OK
    
    ")
        conn.send(b'123123')
        conn.close()
    连接示例(伪代码)

    2. Django框架

    常见python web框架:django(内容大而全),tornado,flask(轻量级),web.py(尽量不用)

    form表单验证
    操作数据库
    缓存
    wsgiref实现网关接口 WSGI:(Web Server Gateway Interface),业务开发中尽量用UWSGI.

    讲Django之前时说的web 框架原理:

    创建完项目(project)之后,写代码之前先配置模板路径(template),静态文件
    python manage.py runserver运行起来,就能访问了 127.0.0.1:8000/login
    MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware', MIDDLEWARE中含有CSRF这一行注释掉
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]

    3.函数

    函数至少一个参数(request) request包括请求相关的所有信息
    request.method获取用户的提交方式,request.post获取用户以POST方式用表单提交过来的数据
    request.get获取用户以GET方式在URL上提交过来的数据

    函数返回数据:return值有:
      1.return http response 返回字符串用的;
      2.return render 给他一个数据,给他一个模板(html文件)
      3.return redirect,重定向到某个URL地址

    模板渲染的时候,还可以利用Django提供的渲染机制,模板:两个大括号,中间写个值,如{{ name }}.
    静态文件后面记得加括号
    urls多加了一个条件,多加了一个对应关系

    以POST方式提交数据的时候,不光request.post有值,request.get里面也有值
    以GET方式提交数据的时候,只有request.get有值
    GET请求--->只有request.GET有值
    POST请求--->request.POST和request.GET都有值

    4.url对应关系
    /login/ login
    def login(request):
    request.method
    request.POST->请求体
    request.GET->请求头

    导入的模块如下

    from django.conf.urls import url
    from django.contrib import admin
    from django.shortcuts import HttpResponse,render,redirect

    return HttpResponse(返回字符串)
    return render(request,'login.html',{}) :执行渲染
    return redirect('要跳转的网址')    (redirect:重定向)

    5.模板引擎中的特殊标记
    login.html
    {{name}} :name这个特殊标记就换成了alex
    def login(request):
    return render(request,'login.html',{'name':'alex'}) : {'name':'alex'}字典
    <p>{{ users.0 }}</p> 取列表里的第一个值
    <p>{{ users.1 }}</p> 取列表里的第二个值

    模板里的特殊标记里还支持循环

    {% for item in users %}
    {{ item }}
    {% endfor %}

    <table>
    {% for row in user_list_dict %}
    <tr>
    <td>{{ row.id }}</td>
    <td>{{ row.name }}</td>
    <td>{{ row.email }}</td>
    </tr>
    {% endfor %}
    </table>每一次循环进来生成一个tr(table row)

    今日作业
    Django+pymysql实现
        -用户登录
        -查看用户列表
    
    1    alex    alex3714@163.com    编辑 | 删除 点击删除,跳转到另外一个地址
    2    alex    alex3714@126.com    编辑 | 删除
    3    alex    alex3714@gmail.com    编辑 | 删除
    0615作业需求

    总结:Django(必须学会,web框架着重理解)

    web框架:模板引擎+路由映射+socket
    Django用于快速开发网站,快速开发业务系统(BBS+豆瓣)
    Django安装: pip3 install django

    Django启动: 在cmd下运行 django-admin startproject 文件夹名(比如mysite),在对应磁盘创建相应的mysite目录
    D:Program FilesPython36Scripts文件夹下出现一个exe文件django-admin.exe和一个django-admin.py
    D:Program FilesPython36Scripts这一段加到Windows环境变量
    WSGI:web服务网关接口
    wsgiref,uwsgi 两个模块

    D:mysitemysite 有三个文件:
      1.settings.py:存放Django的配置文件,
      2.urls.py存放URL和函数的对应关系,起名叫:路由系统,
      3.wsgi.py:用于定义Django用socket,wsgiref,uwsgi(性能高),调用wsgiref这个模块,wsgi是web服务网关接口,是一个协议,
        这个协议按照这个规则实现socket,wsgiref是实现这个协议的.

    C:Usersing>django-admin startproject bingsite 启动Django服务

    C:Usersing>D:
    D:>cd bingsite 切换目录
    D:ingsite>python manage.py runserver 127.0.0.1:8090 连接服务
    python manage.py runserver 后面不加ip+端口,默认会以127.0.0.1:8000启动
    Performing system checks...

    System check identified no issues (0 silenced).

    You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
    Run 'python manage.py migrate' to apply them.
    June 14, 2017 - 19:52:11
    Django version 1.11.1, using settings 'bingsite.settings'
    Starting development server at http://127.0.0.1:8090/
    Quit the server with CTRL-BREAK.

    在浏览器访问http://127.0.0.1:8090/ 这个地址:

    It worked!
    Congratulations on your first Django-powered page.

    from django.shortcuts import HttpResponse导入模块内容
    def login(request):
    '''
    :param (request):放置用户请求相关的所有信息(对象)
    :return
    '''
    返回一个字符串
    settings.py里的'DIRS': [os.path.join(BASE_DIR, 'templates')], 不管项目名下的模板名字如何改变,都不会影响程序

    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',
                ],
            },
        },
    ]      
    settings.py文件中的TEMPLATES代码

    {%csrf_token%}这一句放在form标签里面:csrf_token用于表单验证。

    笔记整理

    一、WEB框架的本质

    WEB框架的本质是 开启一个socket服务端,用户发送http请求(get/post),服务端内部根据不同的URL请求,发送给用户不同的模板(html网页本质是发送字符串);

    二、WEB框架的组成

    1. socket服务端

    绑定唯一IP+端口,不间断提供服务,让用户连接;

    2、路由系统:URL -> 函数

     根据不同URL请求,返回不同的模板;

    3、模板引擎渲染:(包含在模板中特殊字符 % 特定数据的替换)

    把特定数据(例如来自数据库)  根据包含在模板中(HTML网页)定义的特殊字符{{特殊字符}} ,替换组织成特定字符串整体发送给客户端。

    三、WEB框架种类

    第一类:同时满足1,2,3条件Tornado

    第二类:[第三方1],2,3 --> wsgiref -例如Django

    第三类: [第三方a],b,[第三方c]  -例如: flask,

    四、创建Django框架:

    1、在CMD创建Django项目

    1.1.安装Django模块:pip3 install django

    1.2、创建Django程序 django-admin startproject mysite

    1.3、进入程序目录 cd mysite

    1.4、启动socket服务端,等待用户发送请求 python manage.py runserver 127.0.0.1:8080

    2、在Pycharm创建Django项目

    左上角file--->NewProject--->

    五、Django目录配置

    1、Django框架包含的文件说明:

    seting.py -----Django的配置文件

    url.py--------路由系统(url和函数的对应关系)

    wsgi.py-------用于定义该Django程序,用什么socket来实现。wsgirof(测试环境) ,uwsgi(生产环境)


    manage.py------对Django程序的所有操作和管理基于该程序例:Python manage.py run server 启动Django程序

    2.配置

     2.1、模板路径配置(html文件存放位置)

     seting.py

    TEMPLATES = [
    {'DIRS': [os.path.join(BASE_DIR, 'templates')]

     2.2、静态文件配置(CSS文件存放位置)

    STATIC_URL = '/static/'

    STATICFILES_DIRS=(
    os.path.join(BASE_DIR,'static'),
    )

    2.3额外配置(注释)

    MIDDLEWARE = [

    # 'django.middleware.csrf.CsrfViewMiddleware',
    ]

    总结:

    1、创建project

    2、配置
    -------配置模板路径
    -------配置静态文件路径
    -------额外配置

    六、使用Django

    1、路由系统

    urlpatterns = [url(r'URL/',URL对应的处理函数),] 

    urlpatterns = [url(r'login/',login),] ---------URL对应的函数

     

    2、处理函数

    请求相关:

    request对象的属性和方法:(客户端请求相关)

    request.method 提取请求的方法

    request.get 提取get请求头的URL

    request.POST 提取POST请求体,用户输入的数据体;

    {'username': ['zhanggen'], 'password': ['123.com']}

    返回相关:

    return HttpResponse("666") #返回字符串

    retrun redirect("http://www.baidu.com") 返回跳转的网页


    render内部做模板渲染(把模板拿过来,把数据拿过来,把特殊字符做字符串替换)

    return render(request, "logi.html",{'msg':"用户名或者密码错误"})(返回网页)

    def login(request):
        # return HttpResponse("666") #返回字符串
       if request.method=="GET":
           print(request.method)
           return render(request,"logi.html")  # 返回静态文件
       else:
          u=request.POST.get("username")
          p=request.POST.get("password")
          print(u,p)
          if u=="zhanggen" and p=="123.com":
             return redirect("http://www.baidu.com")
          else:
             return render(request, "logi.html",{'msg':"用户名或者密码错误"})
    
    def index(request):
        return render(request,"index.html",{"name":"alex",
                                              "users":["李志","李杰"]
                                            ,"user_dict":{"k1":"v1","k2":"v2"},
    
                                            'user_name':[{'id':1,'name':"张根","gender":"man"},
                                                         {'id': 2, 'name': "游勤兵", "gender": "man"},
                                                         {'id': 3, 'name': "高路川", "gender": "man"}
    
                                                         ]
    
                                             })
    
    urlpatterns = [
        url(r'login/',login),
        url(r'index/',index),
    ]
    代码示例1

    3、模板引擎中的特殊标记

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>ss</title>
    </head>
    <body>
    <h1>模板特殊标记</h1>
    <p>{{name}}</p>
    <p>{{users.0}}</p>
    <p>{{users.1}}</p>
    <p>{{user_dict.k2}}</p>
    <p>{{user_dict.k1}}</p>
    <h3>循环</h3>
    {% for item in user_dict %}
       <h1>{{ item }}</h1>
    {% endfor %}
    
       <table border="1">
           {% for row in user_name%}
    
        <tr>
            <td>{{ row.id }}</td>
            <td>{{ row.name }}</td>
            <td>{{ row.gender }}</td>
            <td><a href="">编辑|删除</a></td>
    
        </tr>
           {% endfor %}
    </table>
    
    
    
    
    </body>
    </html>
    代码示例2
  • 相关阅读:
    结对项目--四则运算“软件”之升级版
    个人项目--多元四则运算
    《构建之法》1-5章后感
    git bash的安装与配置
    随笔
    numpy数组及处理:效率对比
    完整的中英文词频统计
    组合数据类型,英文词频统计
    9.13作业2(完整温度转换、数字游戏、解析身份证号...)
    Mad Libs游戏,华氏与摄氏转换
  • 原文地址:https://www.cnblogs.com/bingabcd/p/7012436.html
Copyright © 2020-2023  润新知