Python 颤振/省道不从本地托管的烧瓶api返回值
使用IOS、Visual Studio代码、Flask、VirtualEnv 我刚开始玩Flask和Flatter。我已经创建了一个本地托管的flask服务器,它通过api返回用户,我正在尝试使用我的usb连接的IOS设备通过Flatter访问api。当我尝试internet上托管的api时,我会在手机上获得输出,但是当我指向本地api时,它看起来并没有击中服务器,我在flask服务器日志中没有收到任何响应,表明发出了请求。我做错了什么 通过我的浏览器,我可以导航到127.0.0.1:5000/用户,并获得以下输出。我希望这会出现在我的手机上: [{“姓名”:“尼克”,“年龄”:42,“职业”:“网络工程师”}, {“姓名”:“埃尔文”,“年龄”:32,“职业”:“业务分析师”}, {“姓名”:“尼克”,“年龄”:22,“职业”:“测试分析员”}] 这是我的flask服务器代码:Python 颤振/省道不从本地托管的烧瓶api返回值,python,ios,api,flask,flutter,Python,Ios,Api,Flask,Flutter,使用IOS、Visual Studio代码、Flask、VirtualEnv 我刚开始玩Flask和Flatter。我已经创建了一个本地托管的flask服务器,它通过api返回用户,我正在尝试使用我的usb连接的IOS设备通过Flatter访问api。当我尝试internet上托管的api时,我会在手机上获得输出,但是当我指向本地api时,它看起来并没有击中服务器,我在flask服务器日志中没有收到任何响应,表明发出了请求。我做错了什么 通过我的浏览器,我可以导航到127.0.0.1:5000/
from flask import Flask
from flask_restful import Api, Resource, reqparse
from flask import jsonify
import json
app = Flask(__name__)
api = Api(app)
users = [
{
"name": "Nick",
"age": 42,
"occupation": "Network Engineer"
},
{
"name": "Elvin",
"age": 32,
"occupation": "Business Analyst"
},
{
"name": "Nick",
"age": 22,
"occupation": "Test Analyst"
}
]
class User(Resource):
def get(self, name):
for user in users:
if(name ==user["name"]):
return user, 200
return "User not found@, 404"
def post(self, name):
parser = reqparse.RequestParser()
parser.add_argument("age")
parser.add_argument("occupation")
args = parser.parse_args()
for user in users:
if(name == user["name"]):
return "User with name {} already exist".format(name), 400
user = {
"name": name,
"age": args["age"],
"occupation": args["occupation"]
}
users.append(user)
return user, 201
def put(self, name):
parser = reqparse.RequestParser()
parser.add_argument("age")
parser.add_argument("occupation")
args = parser.parse_args()
for user in users:
if(name == user["name"]):
user["age"] = args["age"]
user["occupation"] = args["occupation"]
return user, 200
user = {
"name": name,
"age": args["age"],
"occupation": args["occupation"]
}
users.append(user)
return user, 201
def delete(self, name):
global users
users = [user for user in users if user["name"] != name]
return "{} is deleted.".format(name), 200
@app.route('/users', methods=['GET'])
def getUsers():
return json.dumps(users)
api.add_resource(User, "/user/<string:name>")
app.run(debug=True)
这是我的用户.dart
class User {
String name;
int age;
String occupation;
User(String name, int age, String occupation) {
this.name = name;
this.age = age;
this.occupation = occupation;
}
User.fromJson(Map json)
: name = json['name'],
age = json['age'],
occupation = json['occupation'];
Map toJson() {
return {'name': name, 'age': age, 'occupation': occupation};
}
}
这是我的主飞镖
import 'dart:convert';
import 'package:apitest2/API.dart';
import 'package:apitest2/User.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
build(context) {
return MaterialApp(
debugShowCheckedModeBanner: true,
title: 'My Http App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyListScreen(),
);
}
}
class MyListScreen extends StatefulWidget {
@override
createState() => _MyListScreenState();
}
class _MyListScreenState extends State {
var users = new List<User>();
_getUsers() {
API.getUsers().then((response) {
setState(() {
Iterable list = json.decode(response.body);
users = list.map((model) => User.fromJson(model)).toList();
});
});
}
initState() {
super.initState();
_getUsers();
}
dispose() {
super.dispose();
}
@override
build(context) {
return Scaffold(
appBar: AppBar(
title: Text("User List"),
),
body: ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
return ListTile(title: Text(users[index].name));
},
));
}
}
导入'dart:convert';
导入“package:apites2/API.dart”;
导入“package:apites2/User.dart”;
进口“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
构建(上下文){
返回材料PP(
debugShowCheckedModeBanner:true,
标题:“我的Http应用程序”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyListScreen(),
);
}
}
类MyListScreen扩展StatefulWidget{
@凌驾
createState()=>_MyListScreenState();
}
类_MyListScreenState扩展状态{
var users=新列表();
_getUsers(){
API.getUsers().then((响应){
设置状态(){
Iterable list=json.decode(response.body);
users=list.map((model)=>User.fromJson(model)).toList();
});
});
}
initState(){
super.initState();
_getUsers();
}
处置{
super.dispose();
}
@凌驾
构建(上下文){
返回脚手架(
appBar:appBar(
标题:文本(“用户列表”),
),
正文:ListView.builder(
itemCount:users.length,
itemBuilder:(上下文,索引){
返回ListTile(标题:Text(用户[index].name));
},
));
}
}
主旨
- 如果我们希望从连接到LAN的其他计算机或设备向API发出HTTP请求,我们应该使用开发计算机IP地址0.0.0.0(对于IPv4配置)或::(对于IPv6配置)作为开发服务器所需的IP地址
- 如果我们指定0.0.0.0作为IPv4配置所需的IP地址,则开发服务器将侦听端口5000上的每个接口
class User {
String name;
int age;
String occupation;
User(String name, int age, String occupation) {
this.name = name;
this.age = age;
this.occupation = occupation;
}
User.fromJson(Map json)
: name = json['name'],
age = json['age'],
occupation = json['occupation'];
Map toJson() {
return {'name': name, 'age': age, 'occupation': occupation};
}
}
import 'dart:convert';
import 'package:apitest2/API.dart';
import 'package:apitest2/User.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
build(context) {
return MaterialApp(
debugShowCheckedModeBanner: true,
title: 'My Http App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyListScreen(),
);
}
}
class MyListScreen extends StatefulWidget {
@override
createState() => _MyListScreenState();
}
class _MyListScreenState extends State {
var users = new List<User>();
_getUsers() {
API.getUsers().then((response) {
setState(() {
Iterable list = json.decode(response.body);
users = list.map((model) => User.fromJson(model)).toList();
});
});
}
initState() {
super.initState();
_getUsers();
}
dispose() {
super.dispose();
}
@override
build(context) {
return Scaffold(
appBar: AppBar(
title: Text("User List"),
),
body: ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
return ListTile(title: Text(users[index].name));
},
));
}
}