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
原文地址:https://www.cnblogs.com/bingabcd/p/7012436.html